libebml_ng
struct.h
Go to the documentation of this file.
1 #ifndef EBML_NG_STRUCT_H
2 #define EBML_NG_STRUCT_H
3 
4 #include <string.h>
5 #include <cstdint>
6 #include <limits>
7 #include <type_traits>
8 #include <string>
9 #include <stdexcept>
10 #include <memory>
11 
12 #ifndef __STDC_IEC_559__
13 #error "IEEE 754 is required for floating-point types"
14 #endif
15 
16 namespace ebml {
26  inline void _reverse(char* s, unsigned int j, unsigned int k) {
27  while (j < k) {
28  s[j] ^= s[k];
29  s[k] ^= s[j];
30  s[j] ^= s[k];
31  j++;
32  k--;
33  }
34  }
35 
49  template<typename T>
50  inline size_t size(const T& value);
51 
66  template<typename T>
67  inline size_t pack(const T& value, char* dest);
68 
85  template<typename T>
86  inline size_t pack(const T& value, size_t size, char* dest);
87 
101  template<typename T>
102  inline std::string pack(const T& value);
103 
118  template<typename T>
119  inline T unpack(const char* src, size_t size);
120 
133  template<typename T>
134  inline T unpack(const std::string& str);
135 }
136 
137 #define DEF_SIZE(T) inline size_t size(const T& value)
138 
139 #define FIXED_SIZE(T, s) \
140  inline size_t size(const T&) { \
141  return s; \
142  }
143 
144 
145 #define DEF_PACK(T) inline size_t pack(const T& value, size_t size, char* dest)
146 #define DEF_PACK_ALT(T) inline size_t pack(const T& value, char* dest)
147 #define DEF_UNPACK(T) \
148  template<> \
149  inline T unpack<T>(const char* src, size_t size)
150 
151 #define DECL_EXTERN_STR_FUNCTIONS(T) \
152  extern template std::string pack(const T&); \
153  extern template T unpack<T>(const std::string&);
154 
155 #define DECL_EXTERN_FUNCTIONS(T) \
156  size_t size(const T&); \
157  size_t pack(const T&, size_t, char*); \
158  template<> \
159  T unpack<T>(const char*, size_t); \
160  extern template size_t pack(const T&, char*); \
161  DECL_EXTERN_STR_FUNCTIONS(T)
162 
163 #define DECL_EXTERN_FUNCTIONS_ALT(T) \
164  size_t size(const T&); \
165  size_t pack(const T&, char*); \
166  template<> \
167  T unpack<T>(const char*, size_t); \
168  extern template size_t pack(const T&, size_t, char*); \
169  DECL_EXTERN_STR_FUNCTIONS(T)
170 
171 #define DECL_EXTERN_FUNCTIONS_ALT2(T) \
172  size_t size(const T&); \
173  size_t pack(const T&, char*); \
174  size_t pack(const T&, size_t, char*); \
175  template<> \
176  T unpack<T>(const char*, size_t); \
177  DECL_EXTERN_STR_FUNCTIONS(T)
178 
179 #define INST_STRING_TEMPLATES(T) \
180  template std::string pack(const T&); \
181  template T unpack<T>(const std::string&);
182 
183 #define INST_TEMPLATES(T) \
184  template size_t pack(const T&, char*); \
185  INST_STRING_TEMPLATES(T)
186 
187 #define INST_TEMPLATES_ALT(T) \
188  template size_t pack(const T&, size_t, char*); \
189  INST_STRING_TEMPLATES(T)
190 
191 #endif
size_t size(const std::string &value)
Definition: binary.h:8
void _reverse(char *s, unsigned int j, unsigned int k)
Reverses the contents of a character array between indices [j, k].
Definition: struct.h:26
Definition: basictypes.h:40
T unpack(const char *src, size_t size)
Unpacks a value of type T from a raw data buffer.
size_t pack(const std::string &value, size_t size, char *dest)
Definition: binary.h:12