ViewVC Help
View File | Revision Log | Show Annotations | Download File | View Changeset | Root Listing
root/repos/Represent/Binary.hpp
(Generate patch)

Comparing:
Represent/represent.cpp (file contents), Revision 367 by douglas, 2004-12-21T03:24:26-08:00 vs.
Represent/Binary.hpp (file contents), Revision 373 by douglas, 2004-12-22T17:27:28-08:00

# Line 4 | Line 4
4   //
5   // $Id$
6  
7 < #include <iostream>
8 < #include <string>
9 < #include <vector>
7 > #ifndef _Binary_hpp_
8 > #define _Binary_hpp_
9  
10 < #include <foreach.hpp>
10 > #include "Represent.hpp"
11 >
12 > #ifdef MENES_PRAGMA_ONCE
13 > #pragma once
14 > #endif
15  
16   class Binary
17   {
18 < private:
19 <        std::vector<char> bytes;
18 > protected:
19 >        ext::Vector<byte_t> bytes;
20 >        Binary(size_t size, byte_t value) : bytes(size, value) {}
21   public:
22 <        Binary(std::string& string, bool signed_ = false);
23 <        template <typename Type>
24 <        Binary(const Type& type);
25 <        template <typename Type>
26 <        Type convert(bool signed_ = false);
23 <        operator std::string() const;
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  
26 Binary::Binary(std::string& string, bool signed_) : bytes(string.size() / 8, 0)
27 {
28        std::string::size_type off(string.size() % 8);
29
30        if (off != 0)
31        {
32                bytes.push_back(0);
33                string.insert(0, 8 - off, signed_ && string[0] == '1' ? '1' : '0');
34        }
35
36        std::string::size_type index(0);
37
38        _rmforeach (std::vector<char>, byte, bytes) _rfor (char, bit, 0, 8) *byte |= (string[index++] == '1') << bit;
39 }
40
29   template <typename Type>
30   Binary::Binary(const Type& type) : bytes(sizeof (type))
31   {
32 <        char* type_(reinterpret_cast<char*>(const_cast<Type*>(&type)));
32 >        byte_t* type_(reinterpret_cast<byte_t*>(const_cast<Type*>(&type)));
33  
34 <        _mforeach (std::vector<char>, byte, bytes) *byte = *type_++;
34 >        _mforeach (ext::Vector<byte_t>, byte, bytes) *byte = *type_++;
35   }
36  
37   template <typename Type>
# Line 51 | Line 39 | Type Binary::convert(bool signed_)
39   {
40          Type type;
41  
42 <        if (sizeof (type) != bytes.size()) bytes.resize(sizeof (type), signed_ && bytes.back() >> 7 ? ~0 : 0);
42 >        if (sizeof (type) != bytes.GetSize()) bytes.SetSize(sizeof (type), signed_ && bytes.Last() >> 7 ? ~0 : 0);
43  
44 <        char* type_(reinterpret_cast<char*>(&type));
44 >        byte_t* type_(reinterpret_cast<byte_t*>(&type));
45  
46 <        _foreach (std::vector<char>, byte, bytes) *type_++ = *byte;
46 >        _foreach (ext::Vector<byte_t>, byte, bytes) *type_++ = *byte;
47  
48          return type;
49   }
50  
51 < Binary::operator std::string() const
64 < {
65 <        std::string string;
66 <
67 <        _rforeach (std::vector<char>, byte, bytes) _rfor (char, bit, 0, 8) string +=1 & *byte >> bit ? '1' : '0';
68 <
69 <        return string;
70 < }
71 <
72 < inline std::ostream& operator<<(std::ostream& out, const Binary& binary)
51 > inline ios::PrintWriter& operator<<(ios::PrintWriter& out, const Binary& binary)
52   {
53 <        return out << std::string(binary);
53 >        return out << binary.operator ext::String();
54   }
55  
56 < int main(int argc, char* argv[])
78 < {
79 <        std::string hello("Hello, World!");
80 <
81 <        _foreach (std::string, atom, hello) std::cout << Binary(*atom) << " = " << *atom << std::endl;
82 <
83 <        _fori (index, -10, 11) std::cout << Binary(index) << " = " << index << std::endl;
84 <
85 <        _foru (index, -10, 11) std::cout << Binary(index) << " = " << index << std::endl;
86 <
87 <        for (float index(-1.0); index < 1.0; index += 0.1) std::cout << Binary(index) << " = " << index << std::endl;
88 <
89 <        for (double index(-1.0); index < 1.0; index += 0.1) std::cout << Binary(index) << " = " << index << std::endl;
90 <
91 <        std::string string("101001101001");
92 <        Binary binary(string, true);
93 <
94 <        std::cout << binary << " = " << string << std::endl;
95 <
96 <        float value(binary.convert<float>());
97 <
98 <        std::cout << binary << " = " << value << std::endl << Binary(value) << " = " << value << std::endl;
99 <
100 <        return 0;
101 < }
56 > #endif // _Binary_hpp_

Comparing:
Represent/represent.cpp (property svn:eol-style), Revision 367 by douglas, 2004-12-21T03:24:26-08:00 vs.
Represent/Binary.hpp (property svn:eol-style), Revision 373 by douglas, 2004-12-22T17:27:28-08:00

# Line 0 | Line 1
1 + native

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines