Advertisement
Guest User

Untitled

a guest
Oct 17th, 2016
85
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
D 2.45 KB | None | 0 0
  1. module cbor;
  2.  
  3. private import std.string : format;
  4. private import std.traits : Unqual, isArray, isAssociativeArray, isBoolean, isDynamicArray,
  5.     isExpressionTuple, isFloatingPoint, isIntegral, isSomeChar, isStaticArray, isUnsigned;
  6. public import std.typecons : Flag, Yes, No;
  7. private import std.range : ElementEncodingType, hasLength, save, tee;
  8. private import std.conv : to;
  9. private import std.utf : byChar;
  10. private import std.range : isInputRange, isOutputRange, ElementType;
  11. private import std.typecons : isTuple;
  12.  
  13.  
  14. /// Encodes value E into output range sink.
  15. /// Returns number of bytes written to sink.
  16. /// If flatten flag is yes then static arrays and structs will be encoded in place without headers.
  17. size_t encodeCbor(R, E)(auto ref R sink, auto ref const E value)
  18.     if(isOutputRange!(R, ubyte))
  19. {
  20.     // void* gets into here
  21.     static if (is(E == struct)) {
  22.         return encodeCborArray(sink, value);
  23.     }
  24.     // { ... }
  25.     else {
  26.         static assert(false, "Unable to encode " ~ E.stringof);
  27.     }
  28. }
  29.  
  30. size_t encodeCborArray(R, A)(auto ref R sink, A aggregate)
  31.     if(isOutputRange!(R, ubyte) && is(A == struct))
  32. {
  33.     return encodeCborAggregate(sink, aggregate);
  34. }
  35.  
  36. size_t encodeCborAggregate(R,A)(auto ref R sink, auto ref A aggregate)
  37.     if (isOutputRange!(R, ubyte) && is(A == struct))
  38. {
  39.     size_t size;
  40.  
  41.     foreach(i, member; aggregate.tupleof)
  42.     {
  43.         enum bool encoded = isEncodedFieldValue!(member);
  44.         enum bool encoded2 = isEncodedFieldType!(typeof(member));
  45.         pragma(msg, "encode ", typeof(member), ": ", encoded, " ", encoded2);
  46.  
  47.         static if (encoded)
  48.         {
  49.             size += encodeCbor(sink, member);
  50.         }
  51.     }
  52.     return size;
  53. }
  54.  
  55. private template isEncodedFieldType(member)
  56. {
  57.     pragma(msg, member.stringof, " is type");
  58.     enum bool isEncodedFieldType = isEncodedType!(member);
  59. }
  60.  
  61. private template isEncodedFieldValue(alias member)
  62. {
  63.     pragma(msg, member.stringof, " is value");
  64.  
  65.     enum bool isEncodedFieldValue = isEncodedType!(typeof(member));
  66.     pragma(msg, typeof(member), " ", member.stringof, " ", isEncodedFieldValue, " is value");
  67. }
  68.  
  69. private enum bool isEncodedType(T) = isIntegral!T || isFloatingPoint!T || isBoolean!T ||
  70.     isArray!T || isInputRange!T || isAssociativeArray!T ||
  71.     isTuple!T || is(T == string) || is(T == class) || is(T == struct);
  72.  
  73. unittest
  74. {
  75.     static struct Inner
  76.     {
  77.     }
  78.  
  79.     static struct Test1
  80.     {
  81.         Inner inner;
  82.         void* pointer; // not encoded
  83.     }
  84.  
  85.     ubyte[1024] buf1;
  86.     size_t size;
  87.  
  88.     Test1 test;
  89.     size = encodeCborAggregate(buf1[], test);
  90. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement