1 |
// Represent |
2 |
// |
3 |
// Douglas Thrift |
4 |
// |
5 |
// $Id$ |
6 |
|
7 |
#ifndef _Binary_hpp_ |
8 |
#define _Binary_hpp_ |
9 |
|
10 |
#include "Represent.hpp" |
11 |
|
12 |
#ifdef MENES_PRAGMA_ONCE |
13 |
#pragma once |
14 |
#endif |
15 |
|
16 |
class Binary |
17 |
{ |
18 |
protected: |
19 |
ext::Vector<byte_t> bytes; |
20 |
Binary(size_t size, byte_t value) : bytes(size, value) {} |
21 |
public: |
22 |
Binary() : bytes(size_t(1), 0) {} |
23 |
Binary(const ext::String& string, bool signed_); |
24 |
template <typename Type> Binary(const Type& type); |
25 |
template <typename Type> Type convert(bool signed_); |
26 |
virtual operator ext::String() const; |
27 |
}; |
28 |
|
29 |
template <typename Type> |
30 |
Binary::Binary(const Type& type) : bytes(sizeof (type)) |
31 |
{ |
32 |
byte_t* type_(reinterpret_cast<byte_t*>(const_cast<Type*>(&type))); |
33 |
|
34 |
_foreach (ext::Vector<byte_t>, byte, bytes) *byte = *type_++; |
35 |
} |
36 |
|
37 |
template <typename Type> |
38 |
Type Binary::convert(bool signed_) |
39 |
{ |
40 |
Type type; |
41 |
|
42 |
if (sizeof (type) != bytes.GetSize()) bytes.SetSize(sizeof (type), signed_ && bytes.Last() >> 7 ? ~0 : 0); |
43 |
|
44 |
byte_t* type_(reinterpret_cast<byte_t*>(&type)); |
45 |
|
46 |
_foreach (ext::Vector<byte_t>, byte, bytes) *type_++ = *byte; |
47 |
|
48 |
return type; |
49 |
} |
50 |
|
51 |
#endif // _Binary_hpp_ |