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