libebml_ng
ll.h
Go to the documentation of this file.
1 #ifndef EBML_NG_LL_H
2 #define EBML_NG_LL_H
3 
4 #include "libebml_ng/struct.h"
5 
6 namespace ebml {
7  DEF_SIZE(long long) {
8  unsigned long long k = 1;
9  long long c = 128;
10 
11  while (k < 8) {
12  if ((-c <= value) && (value < c)) {
13  return k;
14  }
15  k++;
16  c <<= 8;
17  }
18 
19  return 8;
20  }
21 
22  DEF_PACK(long long) {
23  char* as_chars;
24 
25  if (size == 0 or size > 8) {
26  throw std::invalid_argument("pack: invalid value for size");
27  };
28 
29  if (size != 8) {
30  if (value > 0 && (value >> (8*size)) != 0) {
31  throw std::overflow_error("pack: int too big to convert");
32  };
33  if (value < 0 && (value >> (8*size)) != -1) {
34  throw std::overflow_error("pack: int too big to convert");
35  };
36  };
37 
38  as_chars = (char*)&value;
39 
40  if (std::endian::native == std::endian::little) {
41  memcpy(dest, as_chars, size);
42  _reverse(dest, 0, size - 1);
43  } else {
44  memcpy(dest, as_chars + (8 - size), size);
45  }
46 
47  return size;
48  }
49 
50  DEF_UNPACK(long long) {
51  long long ret = 0;
52  char* as_chars;
53 
54  if (size == 0) {
55  return 0;
56  };
57 
58  if (size > 8) {
59  throw std::invalid_argument("unpack<long long>: invalid value for size");
60  };
61 
62  as_chars = (char*)&ret;
63 
64  if (src[0] & -128) {
65  ret = -1ll;
66  } else {
67  ret = 0;
68  }
69 
70  if (std::endian::native == std::endian::little) {
71  memcpy(as_chars, src, size);
72  _reverse(as_chars, 0, size - 1);
73  } else {
74  memcpy(as_chars + (8 - size), src, size);
75  }
76 
77  return ret;
78  }
79 }
80 #endif
DEF_SIZE(long long)
Definition: ll.h:7
DEF_UNPACK(float)
Definition: double.h:30
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
DEF_PACK(long long)
Definition: ll.h:22