Advertisement
Guest User

Serializer design document

a guest
Dec 11th, 2016
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.69 KB | None | 0 0
  1.     class Serializer
  2.     {
  3.     public:
  4.         // interface
  5.         class Serializable {};
  6.         // could be binary or textual
  7.         class InOutStream {};
  8.  
  9.         template<typename T>
  10.         /* insert SFINAE here */ Serializer & operator << (const T & data)
  11.         {
  12.             ordered.append(data);
  13.         }
  14.  
  15.         template<typename T>
  16.         /* insert SFINAE here */ Serializer & operator >> (T & data)
  17.         {
  18.             ordered.extract(data);
  19.         }
  20.  
  21.         template<typename C>
  22.         auto operator << (C & data) -> decltype(std::advance(data.begin() - data.end()), Serializer &)
  23.         {
  24.             ordered.append((std::uint64_t)std::advance(data.begin() - data.end());
  25.             std::for_each(data.begin(), data.end(),
  26.                 [this](auto & it)
  27.                 {
  28.                     // selects local operator for primitives, global operator for complex
  29.                     (*this) << *it;
  30.                 }
  31.             );
  32.         }
  33.  
  34.         template<typename C>
  35.         auto operator >> (C & data) -> decltype(append(data, *data.begin()), Serializer &)
  36.         {
  37.             std::uint64_t size;
  38.             ordered.extract(size);
  39.  
  40.             typedef std::iterator_traits<decltype(data.begin())>::value_type Type;
  41.  
  42.             while (size--> 0)
  43.             {
  44.                 Type element;
  45.                 (*this) >> element;
  46.                 // some templated function
  47.                 append(data, std::move(element));
  48.             }
  49.         }
  50.  
  51.         Serializer & operator [] (const std::string & s)
  52.         {
  53.             return unordered[s];
  54.         }
  55.  
  56.         std::pair<std::size_t, std::unique_ptr<char[]>> compile();
  57.         void build(std::pair<std::size_t, std::unique_ptr<char[]>>);
  58.  
  59.  
  60.     private:
  61.         InOutStream unordered;
  62.         std::map<std::string, Serializer> ordered;
  63.     };
  64.  
  65.  
  66.     Serializer & operator << (Serializer & left, const Serializer::Serializable & right)
  67.     {
  68.         return right.save(left, left.getVersion());
  69.     }
  70.  
  71.     Serializer & operator >> (Serializer & left, Serializer::Serializable & right)
  72.     {
  73.         return right.load(left, left.getVersion());
  74.     }
  75.  
  76.     class Y : public Serializer::Serializable
  77.     {
  78.         void load(Serializer & s, const Version v) override
  79.         {
  80.             data.clear();
  81.             s >> data;
  82.         }
  83.  
  84.         void save(Serializer & s, const Version v) override
  85.         {
  86.             s << data;
  87.         }
  88.  
  89.         std::vector<Y> data;
  90.     };
  91.  
  92.     class X : public Serializer::Serializable
  93.     {
  94.         void load(Serializer & s, const Version v) override
  95.         {
  96.             // primitives, ordered
  97.             s >> x >> k;
  98.             s >> y1;
  99.  
  100.             // non-ordered data
  101.             if (v > Version(0, 1, 0))
  102.                 s["data"]["something"] >> y2;
  103.  
  104.         }
  105.  
  106.         void save(Serializer & s, const Version v) override
  107.         {
  108.             // primitives, ordered data
  109.             s << x << k;
  110.             s << y2;
  111.  
  112.             // non-ordered data
  113.             if(v > Version(0, 1, 0))
  114.                 ss["data"]["something"] << y2;
  115.  
  116.         }
  117.  
  118.         std::uint32_t x, k;
  119.         Y y1, y2;
  120.     };
  121.  
  122.     void test()
  123.     {
  124.         {
  125.             X x;
  126.             Serializer s;
  127.             s << x;
  128.  
  129.             writeFile(s.compile());
  130.         }
  131.  
  132.         {
  133.             X x;
  134.             Serializer s;
  135.             s.build(readFile());
  136.  
  137.             s >> x;
  138.         }
  139.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement