File: serializable.h

package info (click to toggle)
aoflagger 3.4.0-4
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 8,960 kB
  • sloc: cpp: 83,076; python: 10,187; sh: 260; makefile: 178
file content (102 lines) | stat: -rw-r--r-- 2,860 bytes parent folder | download | duplicates (2)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
#ifndef SERIALIZABLE_H
#define SERIALIZABLE_H

#include <iostream>
#include <complex>

#include <stdint.h>

class Serializable {
 public:
  virtual ~Serializable() {}
  virtual void Serialize(std::ostream& stream) const = 0;
  virtual void Unserialize(std::istream& stream) = 0;

  template <typename T>
  static void SerializeToUInt64(std::ostream& stream, T value) {
    uint64_t val64t = value;
    stream.write(reinterpret_cast<char*>(&val64t), sizeof(val64t));
  }

  template <typename T>
  static void SerializeToUInt32(std::ostream& stream, T value) {
    uint32_t val32t = value;
    stream.write(reinterpret_cast<char*>(&val32t), sizeof(val32t));
  }

  static void SerializeToFloat(std::ostream& stream, float value) {
    stream.write(reinterpret_cast<char*>(&value), sizeof(value));
  }

  static void SerializeToDouble(std::ostream& stream, double value) {
    stream.write(reinterpret_cast<char*>(&value), sizeof(value));
  }

  static void SerializeToLDouble(std::ostream& stream, long double value) {
    stream.write(reinterpret_cast<char*>(&value), sizeof(value));
  }

  static void SerializeToLDoubleC(std::ostream& stream,
                                  std::complex<long double> value) {
    stream.write(reinterpret_cast<char*>(&value), sizeof(value));
  }

  static void SerializeToString(std::ostream& stream, const std::string& str) {
    SerializeToUInt64(stream, str.size());
    stream.write(str.c_str(), str.size());
  }

  static uint64_t UnserializeUInt64(std::istream& stream) {
    return Unserialize<uint64_t>(stream);
  }

  static uint32_t UnserializeUInt32(std::istream& stream) {
    return Unserialize<uint32_t>(stream);
  }

  static double UnserializeFloat(std::istream& stream) {
    return Unserialize<float>(stream);
  }

  static double UnserializeDouble(std::istream& stream) {
    return Unserialize<double>(stream);
  }

  static long double UnserializeLDouble(std::istream& stream) {
    return Unserialize<long double>(stream);
  }

  static std::complex<long double> UnserializeLDoubleC(std::istream& stream) {
    return Unserialize<std::complex<long double>>(stream);
  }

  static void UnserializeString(std::istream& stream, std::string& destStr) {
    size_t size = UnserializeUInt64(stream);
    char* str = new char[size];
    stream.read(str, size);
    destStr = std::string(str, size);
    delete[] str;
  }

  static std::string UnserializeString(std::istream& stream) {
    size_t size = UnserializeUInt64(stream);
    std::string result;
    if (size) {
      char* str = new char[size];
      stream.read(str, size);
      result = std::string(str, size);
      delete[] str;
    }
    return result;
  }

 private:
  template <typename T>
  static T Unserialize(std::istream& stream) {
    T val;
    stream.read(reinterpret_cast<char*>(&val), sizeof(val));
    return val;
  }
};

#endif