ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Represent/Binary.hpp
Revision: 373
Committed: 2004-12-22T17:27:28-08:00 (20 years, 6 months ago) by douglas
File size: 1207 byte(s)
Log Message:
Even better!

File Contents

# Content
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 _mforeach (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 inline ios::PrintWriter& operator<<(ios::PrintWriter& out, const Binary& binary)
52 {
53 return out << binary.operator ext::String();
54 }
55
56 #endif // _Binary_hpp_

Properties

Name Value
svn:eol-style native
svn:keywords Id