diff options
| author | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-03 20:22:08 +0300 |
|---|---|---|
| committer | Oskari Timperi <oskari.timperi@iki.fi> | 2018-04-03 20:22:08 +0300 |
| commit | 54280463ac487e331daa43453058d02599f85102 (patch) | |
| tree | 8790efccb67cefcb08359131745cbf68552f0d84 /src | |
| parent | e2cfc6717ae8acd9c47a132fa2cbc8446b5920c5 (diff) | |
| download | nimpb-54280463ac487e331daa43453058d02599f85102.tar.gz nimpb-54280463ac487e331daa43453058d02599f85102.zip | |
Generate less and more cleaner code
Diffstat (limited to 'src')
| -rw-r--r-- | src/protobuf/protobuf.nim | 94 |
1 files changed, 94 insertions, 0 deletions
diff --git a/src/protobuf/protobuf.nim b/src/protobuf/protobuf.nim index 98bb7a4..d15bfc7 100644 --- a/src/protobuf/protobuf.nim +++ b/src/protobuf/protobuf.nim @@ -1,4 +1,6 @@ import endians +import intsets +import macros import streams import strutils @@ -190,42 +192,70 @@ proc readTag*(stream: ProtobufStream): Tag = proc writeInt32*(stream: ProtobufStream, n: int32) = writeVarint(stream, n.uint64) +proc writeInt32*(stream: ProtobufStream, n: int32, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.Varint) + writeInt32(stream, n) + proc readInt32*(stream: ProtobufStream): int32 = result = readVarint(stream).int32 proc writeSInt32*(stream: ProtobufStream, n: int32) = writeVarint(stream, zigzagEncode(n)) +proc writeSInt32*(stream: ProtobufStream, n: int32, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.Varint) + writeVarint(stream, zigzagEncode(n)) + proc readSInt32*(stream: ProtobufStream): int32 = result = zigzagDecode(readVarint(stream).uint32) proc writeUInt32*(stream: ProtobufStream, n: uint32) = writeVarint(stream, n) +proc writeUInt32*(stream: ProtobufStream, n: uint32, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.Varint) + writeVarint(stream, n) + proc readUInt32*(stream: ProtobufStream): uint32 = result = readVarint(stream).uint32 proc writeInt64*(stream: ProtobufStream, n: int64) = writeVarint(stream, n.uint64) +proc writeInt64*(stream: ProtobufStream, n: int64, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.Varint) + writeVarint(stream, n.uint64) + proc readInt64*(stream: ProtobufStream): int64 = result = readVarint(stream).int64 proc writeSInt64*(stream: ProtobufStream, n: int64) = writeVarint(stream, zigzagEncode(n)) +proc writeSInt64*(stream: ProtobufStream, n: int64, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.Varint) + writeVarint(stream, zigzagEncode(n)) + proc readSInt64*(stream: ProtobufStream): int64 = result = zigzagDecode(readVarint(stream)) proc writeUInt64*(stream: ProtobufStream, n: uint64) = writeVarint(stream, n) +proc writeUInt64*(stream: ProtobufStream, n: uint64, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.Varint) + writeVarint(stream, n) + proc readUInt64*(stream: ProtobufStream): uint64 = result = readVarint(stream) proc writeBool*(stream: ProtobufStream, value: bool) = writeVarint(stream, value.uint32) +proc writeBool*(stream: ProtobufStream, n: bool, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.Varint) + writeVarint(stream, n.uint32) + proc readBool*(stream: ProtobufStream): bool = result = readVarint(stream).bool @@ -238,6 +268,10 @@ proc writeFixed64*(stream: ProtobufStream, value: uint64) = write(stream, output) +proc writeFixed64*(stream: ProtobufStream, n: uint64, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.Fixed64) + writeFixed64(stream, n) + proc readFixed64*(stream: ProtobufStream): uint64 = var tmp: uint64 if readData(stream, addr(tmp), sizeof(tmp)) != sizeof(tmp): @@ -247,6 +281,10 @@ proc readFixed64*(stream: ProtobufStream): uint64 = proc writeSFixed64*(stream: ProtobufStream, value: int64) = writeFixed64(stream, cast[uint64](value)) +proc writeSFixed64*(stream: ProtobufStream, value: int64, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.Fixed64) + writeSFixed64(stream, value) + proc readSFixed64*(stream: ProtobufStream): int64 = result = cast[int64](readFixed64(stream)) @@ -259,6 +297,10 @@ proc writeDouble*(stream: ProtobufStream, value: float64) = write(stream, output) +proc writeDouble*(stream: ProtobufStream, value: float64, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.Fixed64) + writeDouble(stream, value) + proc readDouble*(stream: ProtobufStream): float64 = var tmp: uint64 if readData(stream, addr(tmp), sizeof(tmp)) != sizeof(tmp): @@ -274,6 +316,10 @@ proc writeFixed32*(stream: ProtobufStream, value: uint32) = write(stream, output) +proc writeFixed32*(stream: ProtobufStream, value: uint32, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.Fixed32) + writeFixed32(stream, value) + proc readFixed32*(stream: ProtobufStream): uint32 = var tmp: uint32 if readData(stream, addr(tmp), sizeof(tmp)) != sizeof(tmp): @@ -283,6 +329,10 @@ proc readFixed32*(stream: ProtobufStream): uint32 = proc writeSFixed32*(stream: ProtobufStream, value: int32) = writeFixed32(stream, cast[uint32](value)) +proc writeSFixed32*(stream: ProtobufStream, value: int32, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.Fixed32) + writeSFixed32(stream, value) + proc readSFixed32*(stream: ProtobufStream): int32 = result = cast[int32](readFixed32(stream)) @@ -295,6 +345,10 @@ proc writeFloat*(stream: ProtobufStream, value: float32) = write(stream, output) +proc writeFloat*(stream: ProtobufStream, value: float32, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.Fixed32) + writeFloat(stream, value) + proc readFloat*(stream: ProtobufStream): float32 = var tmp: float32 if readData(stream, addr(tmp), sizeof(tmp)) != sizeof(tmp): @@ -305,9 +359,16 @@ proc writeString*(stream: ProtobufStream, s: string) = writeUInt64(stream, len(s).uint64) write(stream, s) +proc writeString*(stream: ProtobufStream, s: string, fieldNumber: int) = + writeTag(stream, fieldNumber, WireType.LengthDelimited) + writeString(stream, s) + proc writeBytes*(stream: ProtobufStream, s: bytes) = writeString(stream, string(s)) +proc writeBytes*(stream: ProtobufStream, s: bytes, fieldNumber: int) = + writeString(stream, string(s), fieldNumber) + proc safeReadStr*(stream: Stream, size: int): string = result = newString(size) if readData(stream, addr(result[0]), size) != size: @@ -400,6 +461,12 @@ proc sizeOfSInt64*(value: int64): uint64 = proc sizeOfEnum*[T](value: T): uint64 = result = sizeOfUInt32(value.uint32) +proc sizeOfLengthDelimited*(size: uint64): uint64 = + result = size + sizeOfVarint(size) + +proc sizeOfTag*(fieldNumber: int, wiretype: WireType): uint64 = + result = sizeOfUInt32(uint32(makeTag(fieldNumber, wiretype))) + proc skipField*(stream: ProtobufStream, wiretype: WireType) = case wiretype of WireType.Varint: @@ -421,3 +488,30 @@ proc expectWireType*(actual: WireType, expected: varargs[WireType]) = let message = "Got wiretype " & $actual & " but expected: " & join(expected, ", ") raise newException(UnexpectedWireTypeError, message) + +macro writeMessage*(stream: ProtobufStream, message: typed, fieldNumber: int): typed = + ## Write a message to a stream with tag and length. + let t = getTypeInst(message) + result = newStmtList( + newCall( + ident("writeTag"), + stream, + fieldNumber, + newDotExpr(ident("WireType"), ident("LengthDelimited")) + ), + newCall( + ident("writeVarint"), + stream, + newCall(ident("sizeOf" & $t), message) + ), + newCall( + ident("write" & $t), + stream, + message + ) + ) + +proc excl*(s: var IntSet, values: openArray[int]) = + ## Exclude multiple values from an IntSet. + for value in values: + excl(s, value) |
