Skip to content

Commit 451be67

Browse files
Merge branch 'bollhals-apigenimprovements'
2 parents 5550022 + b6c6ce6 commit 451be67

File tree

6 files changed

+102
-148
lines changed

6 files changed

+102
-148
lines changed

projects/Apigen/apigen/Apigen.cs

Lines changed: 81 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -587,43 +587,20 @@ public void EmitClassProperties(AmqpClass c)
587587
}
588588
EmitLine("");
589589
foreach (AmqpField f in c.m_Fields)
590-
{
591-
if (!IsBoolean(f))
592-
{
593-
EmitLine($" private bool _{MangleMethod(f.Name)}_present = false;");
594-
}
595-
}
596-
EmitLine("");
597-
foreach (AmqpField f in c.m_Fields)
598590
{
599591
EmitSpecComment(f.DocumentationComment(" ", "@label"));
600592
EmitLine($" public {maybeOverride}{MapDomain(f.Domain)} {MangleClass(f.Name)}");
601593
EmitLine(" {");
602594
EmitLine($" get => _{MangleMethod(f.Name)};");
603-
EmitLine(" set");
604-
EmitLine(" {");
605-
if (!IsBoolean(f))
606-
{
607-
if (IsReferenceType(f))
608-
{
609-
EmitLine($" _{MangleMethod(f.Name)}_present = value != null;");
610-
611-
}
612-
else
613-
{
614-
EmitLine($" _{MangleMethod(f.Name)}_present = true;");
615-
}
616-
}
617-
EmitLine($" _{MangleMethod(f.Name)} = value;");
618-
EmitLine(" }");
595+
EmitLine($" set => _{MangleMethod(f.Name)} = value;");
619596
EmitLine(" }");
620597
EmitLine("");
621598
}
622599
foreach (AmqpField f in c.m_Fields)
623600
{
624601
if (!IsBoolean(f))
625602
{
626-
EmitLine($" public {maybeOverride}void Clear{MangleClass(f.Name)}() => _{MangleMethod(f.Name)}_present = false;");
603+
EmitLine($" public {maybeOverride}void Clear{MangleClass(f.Name)}() => _{MangleMethod(f.Name)} = default;");
627604
EmitLine("");
628605
}
629606
}
@@ -632,7 +609,7 @@ public void EmitClassProperties(AmqpClass c)
632609
{
633610
if (!IsBoolean(f))
634611
{
635-
EmitLine($" public {maybeOverride}bool Is{MangleClass(f.Name)}Present() => _{MangleMethod(f.Name)}_present;");
612+
EmitLine($" public {maybeOverride}bool Is{MangleClass(f.Name)}Present() => _{MangleMethod(f.Name)} != default;");
636613
EmitLine("");
637614
}
638615
}
@@ -647,19 +624,19 @@ public void EmitClassProperties(AmqpClass c)
647624
{
648625
if (IsBoolean(f))
649626
{
650-
EmitLine($" _{MangleMethod(f.Name)} = reader.ReadBit();");
627+
EmitLine($" var {MangleMethod(f.Name)} = reader.ReadBit();");
651628
}
652629
else
653630
{
654-
EmitLine($" _{MangleMethod(f.Name)}_present = reader.ReadPresence();");
631+
EmitLine($" var {MangleMethod(f.Name)}_present = reader.ReadPresence();");
655632
}
656633
}
657634
EmitLine(" reader.FinishPresence();");
658635
foreach (AmqpField f in c.m_Fields)
659636
{
660637
if (!IsBoolean(f))
661638
{
662-
EmitLine($" if (_{MangleMethod(f.Name)}_present) {{ _{MangleMethod(f.Name)} = reader.Read{MangleClass(ResolveDomain(f.Domain))}(); }}");
639+
EmitLine($" if ({MangleMethod(f.Name)}_present) {{ _{MangleMethod(f.Name)} = reader.Read{MangleClass(ResolveDomain(f.Domain))}(); }}");
663640
}
664641
}
665642
EmitLine(" }");
@@ -674,58 +651,56 @@ public void EmitClassProperties(AmqpClass c)
674651
}
675652
else
676653
{
677-
EmitLine($" writer.WritePresence(_{MangleMethod(f.Name)}_present);");
654+
EmitLine($" writer.WritePresence(Is{MangleClass(f.Name)}Present());");
678655
}
679656
}
680657
EmitLine(" writer.FinishPresence();");
681658
foreach (AmqpField f in c.m_Fields)
682659
{
683660
if (!IsBoolean(f))
684661
{
685-
EmitLine($" if (_{MangleMethod(f.Name)}_present) {{ writer.Write{MangleClass(ResolveDomain(f.Domain))}(_{MangleMethod(f.Name)}); }}");
662+
EmitLine($" if (Is{MangleClass(f.Name)}Present()) {{ writer.Write{MangleClass(ResolveDomain(f.Domain))}(_{MangleMethod(f.Name)}); }}");
686663
}
687664
}
688665
EmitLine(" }");
689666
EmitLine("");
690667
EmitLine(" public override int GetRequiredPayloadBufferSize()");
691668
EmitLine(" {");
692-
EmitLine(" int bufferSize = 0;");
693-
EmitLine(" int fieldCount = 0;");
669+
EmitLine($" int bufferSize = {Math.Max((int)Math.Ceiling(c.m_Fields.Count / 15.0), 1) * 2}; // number of presence fields ({c.m_Fields.Count}) in 2 bytes blocks");
694670
foreach (AmqpField f in c.m_Fields)
695671
{
696672
switch (MapDomain(f.Domain))
697673
{
698674
case "byte":
699-
EmitLine($" if (_{MangleMethod(f.Name)}_present) {{ fieldCount++; bufferSize++; }} // _{MangleMethod(f.Name)} in bytes");
675+
EmitLine($" if (Is{MangleClass(f.Name)}Present()) {{ bufferSize++; }} // _{MangleMethod(f.Name)} in bytes");
700676
break;
701677
case "string":
702-
EmitLine($" if (_{MangleMethod(f.Name)}_present) {{ fieldCount++; bufferSize += 1 + Encoding.UTF8.GetByteCount(_{MangleMethod(f.Name)}); }} // _{MangleMethod(f.Name)} in bytes");
678+
EmitLine($" if (Is{MangleClass(f.Name)}Present()) {{ bufferSize += 1 + Encoding.UTF8.GetByteCount(_{MangleMethod(f.Name)}); }} // _{MangleMethod(f.Name)} in bytes");
703679
break;
704680
case "byte[]":
705-
EmitLine($" if (_{MangleMethod(f.Name)}_present) {{ fieldCount++; bufferSize += 4 + _{MangleMethod(f.Name)}.Length; }} // _{MangleMethod(f.Name)} in bytes");
681+
EmitLine($" if (Is{MangleClass(f.Name)}Present()) {{ bufferSize += 4 + _{MangleMethod(f.Name)}.Length; }} // _{MangleMethod(f.Name)} in bytes");
706682
break;
707683
case "ushort":
708-
EmitLine($" if (_{MangleMethod(f.Name)}_present) {{ fieldCount++; bufferSize += 2; }} // _{MangleMethod(f.Name)} in bytes");
684+
EmitLine($" if (Is{MangleClass(f.Name)}Present()) {{ bufferSize += 2; }} // _{MangleMethod(f.Name)} in bytes");
709685
break;
710686
case "uint":
711-
EmitLine($" if (_{MangleMethod(f.Name)}_present) {{ fieldCount++; bufferSize += 4; }} // _{MangleMethod(f.Name)} in bytes");
687+
EmitLine($" if (Is{MangleClass(f.Name)}Present()) {{ bufferSize += 4; }} // _{MangleMethod(f.Name)} in bytes");
712688
break;
713689
case "ulong":
714690
case "AmqpTimestamp":
715-
EmitLine($" if (_{MangleMethod(f.Name)}_present) {{ fieldCount++; bufferSize += 8; }} // _{MangleMethod(f.Name)} in bytes");
691+
EmitLine($" if (Is{MangleClass(f.Name)}Present()) {{ bufferSize += 8; }} // _{MangleMethod(f.Name)} in bytes");
716692
break;
717693
case "bool":
718694
// TODO: implement if used, not used anywhere yet
719695
break;
720696
case "IDictionary<string, object>":
721-
EmitLine($" if (_{MangleMethod(f.Name)}_present) {{ fieldCount++; bufferSize += WireFormatting.GetTableByteCount(_{MangleMethod(f.Name)}); }} // _{MangleMethod(f.Name)} in bytes");
697+
EmitLine($" if (Is{MangleClass(f.Name)}Present()) {{ bufferSize += WireFormatting.GetTableByteCount(_{MangleMethod(f.Name)}); }} // _{MangleMethod(f.Name)} in bytes");
722698
break;
723699
default:
724700
throw new ArgumentOutOfRangeException($"Can't handle size calculations for type = {f.Domain};");
725701
}
726702
}
727703

728-
EmitLine($" bufferSize += Math.Max((int)Math.Ceiling(fieldCount / 15.0), 1) * 2; // number of presence fields in bytes");
729704
EmitLine(" return bufferSize;");
730705
EmitLine(" }");
731706
EmitLine("");
@@ -736,31 +711,23 @@ public void EmitClassProperties(AmqpClass c)
736711
int remaining = c.m_Fields.Count;
737712
foreach (AmqpField f in c.m_Fields)
738713
{
739-
Emit($" sb.Append(\"{f.Name}=\");");
714+
Emit($" sb.Append(\"{f.Name}=\")");
740715
if (IsBoolean(f))
741716
{
742-
Emit($" sb.Append(_{MangleMethod(f.Name)});");
717+
Emit($".Append(_{MangleMethod(f.Name)})");
743718
}
744719
else
745720
{
746-
string x = MangleMethod(f.Name);
747-
if (IsReferenceType(f))
748-
{
749-
Emit($" sb.Append(_{x}_present ? (_{x} == null ? \"(null)\" : _{x}.ToString()) : \"_\");");
750-
}
751-
else
752-
{
753-
Emit($" sb.Append(_{x}_present ? _{x}.ToString() : \"_\");");
754-
}
721+
Emit($".Append(Is{MangleClass(f.Name)}Present() ? _{MangleMethod(f.Name)}.ToString() : \"_\")");
755722
}
756723
remaining--;
757724
if (remaining > 0)
758725
{
759-
EmitLine(" sb.Append(\", \");");
726+
EmitLine(".Append(\", \");");
760727
}
761728
else
762729
{
763-
EmitLine("");
730+
EmitLine(";");
764731
}
765732
}
766733
}
@@ -817,7 +784,6 @@ public void EmitClassMethodImplementations(AmqpClass c)
817784
EmitAutogeneratedSummary(" ", "Private implementation class - do not use directly.");
818785
EmitLine($" internal sealed class {MangleMethodClass(c, m)} : Client.Impl.MethodBase, I{MangleMethodClass(c, m)}");
819786
EmitLine(" {");
820-
EmitLine("");
821787
foreach (AmqpField f in m.m_Fields)
822788
{
823789
EmitLine($" public {MapDomain(f.Domain)} _{MangleMethod(f.Name)};");
@@ -882,69 +848,114 @@ public void EmitClassMethodImplementations(AmqpClass c)
882848
EmitLine("");
883849
EmitLine(" public override int GetRequiredBufferSize()");
884850
EmitLine(" {");
885-
EmitLine(" int bufferSize = 0;");
851+
886852
int bitCount = 0;
853+
int bytesSize = 0;
854+
var commentBuilder = new StringBuilder(" // bytes for ");
887855
foreach (AmqpField f in m.m_Fields)
888856
{
889857
switch (MapDomain(f.Domain))
890858
{
891859
case "byte":
892-
EmitLine($" bufferSize++; // _{MangleMethod(f.Name)} in bytes");
860+
bytesSize++;
861+
commentBuilder.Append('_').Append(MangleMethod(f.Name)).Append(", ");
893862
break;
894863
case "string":
895-
EmitLine($" bufferSize += 1 + Encoding.UTF8.GetByteCount(_{MangleMethod(f.Name)}); // _{MangleMethod(f.Name)} in bytes");
864+
bytesSize++;
865+
commentBuilder.Append("length of _").Append(MangleMethod(f.Name)).Append(", ");
896866
break;
897867
case "byte[]":
898-
EmitLine($" bufferSize += 4 + _{MangleMethod(f.Name)}.Length; // _{MangleMethod(f.Name)} in bytes");
868+
bytesSize += 4;
869+
commentBuilder.Append("length of _").Append(MangleMethod(f.Name)).Append(", ");
899870
break;
900871
case "ushort":
901-
EmitLine($" bufferSize += 2; // _{MangleMethod(f.Name)} in bytes");
872+
bytesSize += 2;
873+
commentBuilder.Append('_').Append(MangleMethod(f.Name)).Append(", ");
902874
break;
903875
case "uint":
904-
EmitLine($" bufferSize += 4; // _{MangleMethod(f.Name)} in bytes");
876+
bytesSize += 4;
877+
commentBuilder.Append('_').Append(MangleMethod(f.Name)).Append(", ");
905878
break;
906879
case "ulong":
907880
case "AmqpTimestamp":
908-
EmitLine($" bufferSize += 8; // _{MangleMethod(f.Name)} in bytes");
881+
bytesSize += 8;
882+
commentBuilder.Append('_').Append(MangleMethod(f.Name)).Append(", ");
909883
break;
910884
case "bool":
885+
if (bitCount == 0)
886+
{
887+
commentBuilder.Append("bit fields, ");
888+
}
911889
bitCount++;
912890
break;
913891
case "IDictionary<string, object>":
914-
EmitLine($" bufferSize += WireFormatting.GetTableByteCount(_{MangleMethod(f.Name)}); // _{MangleMethod(f.Name)} in bytes");
915892
break;
916893
default:
917894
throw new ArgumentOutOfRangeException($"Can't handle size calculations for type = {f.Domain};");
918895
}
919896
}
920897

921-
if (bitCount > 0)
898+
// 13 = " // bytes for "
899+
if (commentBuilder.Length > 14)
900+
{
901+
// cut of last ", "
902+
commentBuilder.Length -= 2;
903+
}
904+
else
922905
{
923-
EmitLine($" bufferSize += {Math.Ceiling(bitCount / 8.0)}; // number of bit fields in bytes");
906+
commentBuilder.Clear();
924907
}
908+
bytesSize += (int)Math.Ceiling(bitCount / 8.0);
909+
EmitLine($" int bufferSize = {bytesSize};{commentBuilder}");
910+
foreach (AmqpField f in m.m_Fields)
911+
{
912+
switch (MapDomain(f.Domain))
913+
{
914+
case "byte":
915+
case "ushort":
916+
case "uint":
917+
case "ulong":
918+
case "AmqpTimestamp":
919+
case "bool":
920+
// size already calculated
921+
break;
922+
case "string":
923+
EmitLine($" bufferSize += Encoding.UTF8.GetByteCount(_{MangleMethod(f.Name)}); // _{MangleMethod(f.Name)} in bytes");
924+
break;
925+
case "byte[]":
926+
EmitLine($" bufferSize += _{MangleMethod(f.Name)}.Length; // _{MangleMethod(f.Name)} in bytes");
927+
break;
928+
case "IDictionary<string, object>":
929+
EmitLine($" bufferSize += WireFormatting.GetTableByteCount(_{MangleMethod(f.Name)}); // _{MangleMethod(f.Name)} in bytes");
930+
break;
931+
default:
932+
throw new ArgumentOutOfRangeException($"Can't handle size calculations for type = {f.Domain};");
933+
}
934+
}
935+
925936
EmitLine(" return bufferSize;");
926937
EmitLine(" }");
927938
EmitLine("");
928939
EmitLine(" public override void AppendArgumentDebugStringTo(StringBuilder sb)");
929940
EmitLine(" {");
930-
EmitLine(" sb.Append(\"(\");");
941+
EmitLine(" sb.Append('(');");
931942
{
932943
int remaining = m.m_Fields.Count;
933944
foreach (AmqpField f in m.m_Fields)
934945
{
935-
Emit($" sb.Append(_{MangleMethod(f.Name)});");
946+
Emit($" sb.Append(_{MangleMethod(f.Name)})");
936947
remaining--;
937948
if (remaining > 0)
938949
{
939-
EmitLine(" sb.Append(\",\");");
950+
EmitLine(".Append(',');");
940951
}
941952
else
942953
{
943-
EmitLine("");
954+
EmitLine(";");
944955
}
945956
}
946957
}
947-
EmitLine(" sb.Append(\")\");");
958+
EmitLine(" sb.Append(')');");
948959
EmitLine(" }");
949960
EmitLine(" }");
950961
}

projects/RabbitMQ.Client/client/api/AmqpTimestamp.cs

Lines changed: 13 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,8 @@
3838
// Copyright (c) 2007-2020 VMware, Inc. All rights reserved.
3939
//---------------------------------------------------------------------------
4040

41+
using System;
42+
4143
namespace RabbitMQ.Client
4244
{
4345
// time representations in mainstream languages: the horror, the horror
@@ -58,7 +60,7 @@ namespace RabbitMQ.Client
5860
/// timestamps are signed or unsigned.
5961
/// </para>
6062
/// </remarks>
61-
public struct AmqpTimestamp
63+
public struct AmqpTimestamp : IEquatable<AmqpTimestamp>
6264
{
6365
/// <summary>
6466
/// Construct an <see cref="AmqpTimestamp"/>.
@@ -74,6 +76,16 @@ public AmqpTimestamp(long unixTime) : this()
7476
/// </summary>
7577
public long UnixTime { get; private set; }
7678

79+
public bool Equals(AmqpTimestamp other) => UnixTime == other.UnixTime;
80+
81+
public override bool Equals(object obj) => obj is AmqpTimestamp other && Equals(other);
82+
83+
public override int GetHashCode() => UnixTime.GetHashCode();
84+
85+
public static bool operator ==(AmqpTimestamp left, AmqpTimestamp right) => left.Equals(right);
86+
87+
public static bool operator !=(AmqpTimestamp left, AmqpTimestamp right) => !left.Equals(right);
88+
7789
/// <summary>
7890
/// Provides a debugger-friendly display.
7991
/// </summary>

projects/RabbitMQ.Client/client/api/IBasicPublishBatch.cs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ namespace RabbitMQ.Client
4444
{
4545
public interface IBasicPublishBatch
4646
{
47-
[Obsolete("Use Add(string exchange, string routingKey, bool mandatory, IBasicProperties properties, ReadOnlyMemory<byte> body) instead. Will be replaced in version 7.0", false)]
48-
void Add(string exchange, string routingKey, bool mandatory, IBasicProperties properties, byte[] body);
47+
void Add(string exchange, string routingKey, bool mandatory, IBasicProperties properties, ReadOnlyMemory<byte> body);
4948
void Publish();
5049
}
5150
}

projects/RabbitMQ.Client/client/impl/BasicPublishBatch.cs

Lines changed: 0 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -62,12 +62,6 @@ internal BasicPublishBatch (ModelBase model, int sizeHint)
6262
_commands = new List<Command>(sizeHint);
6363
}
6464

65-
public void Add(string exchange, string routingKey, bool mandatory, IBasicProperties basicProperties, byte[] body)
66-
{
67-
ReadOnlyMemory<byte> bodyAsMemory = body;
68-
Add(exchange, routingKey, mandatory, basicProperties, bodyAsMemory);
69-
}
70-
7165
public void Add(string exchange, string routingKey, bool mandatory, IBasicProperties basicProperties, ReadOnlyMemory<byte> body)
7266
{
7367
var method = new BasicPublish

0 commit comments

Comments
 (0)