source: trunk/FACT++/src/Converter.h@ 11702

Last change on this file since 11702 was 11702, checked in by tbretz, 13 years ago
Added GetSize() memember function and return this value in case of errors.
File size: 5.3 KB
Line 
1#ifndef FACT_Converter
2#define FACT_Converter
3
4#include <math.h>
5
6#include <vector>
7#include <iomanip>
8#include <sstream>
9
10#include <boost/any.hpp>
11
12#include <stdexcept>
13
14#include <iostream>
15
16class Converter
17{
18public:
19 typedef std::pair<const std::type_info *, int> Type;
20 typedef std::pair<int, int> Offset;
21 typedef std::pair<Type, Offset> Format;
22 typedef std::vector<Format> FormatList;
23
24 struct O { };
25 struct W { };
26
27 static std::string Clean(std::string s);
28
29private:
30 std::ostream &wout; /// ostream to which output is redirected
31
32 const std::string fFormat; /// Original format string
33 const FormatList fList; /// Compiled format description
34
35 template <class T>
36 T Get(std::stringstream &line) const;
37
38 bool GetBool(std::stringstream &line) const;
39 std::string GetString(std::stringstream &line) const;
40 std::string GetStringEol(std::stringstream &line) const;
41
42 template<class T>
43 void GetBinImp(std::vector<char> &v, const T &val) const;
44 template<class T>
45 void GetBinImp(std::vector<boost::any> &v, const T &val) const;
46
47 void GetBinString(std::vector<char> &v, const std::string &val) const;
48 void GetBinString(std::vector<boost::any> &v, const std::string &val) const;
49
50 template<class T>
51 std::string GetString(const char *&data) const;
52
53 template<class T>
54 static Type GetType();
55 template<class T>
56 static Type GetVoid();
57
58 template <class T>
59 std::vector<T> Get(const std::string &str) const;
60 template <class T>
61 T Get(const void *d, size_t size) const;
62
63
64
65 template<class T>
66 void Add(std::string &str, const char* &ptr) const;
67 void AddString(std::string &str, const char* &ptr) const;
68 template<class T>
69 void Add(std::vector<boost::any> &vec, const char* &ptr) const;
70 void AddString(std::vector<boost::any> &vec, const char* &ptr) const;
71
72
73public:
74 Converter(std::ostream &out, const std::string &fmt, bool strict=true);
75 Converter(const std::string &fmt, bool strict=true);
76
77 /// @returns whether the interpreted format was valid but empty ("")
78 bool empty() const { return fList.size()==1 && fList.back().first.second==0; }
79
80 /// @returns whether the compilation was successfull
81 bool valid() const { return !fList.empty() && fList.back().first.second==0; }
82
83 /// @returns true if the compilation failed
84 bool operator!() const { return !valid(); }
85
86 const FormatList &GetList() const { return fList; }
87 size_t GetSize() const { return fList.size()==0 ? 0 : fList.back().second.second; }
88
89 static FormatList Compile(std::ostream &out, const std::string &fmt, bool strict=false);
90 static FormatList Compile(const std::string &fmt, bool strict=false);
91
92 std::string GetString(const void *d, size_t size) const;
93 std::vector<char> GetVector(const void *d, size_t size) const;
94 std::vector<boost::any> GetAny(const void *d, size_t size) const;
95
96 std::vector<boost::any> GetAny(const std::string &str) const;
97 std::vector<char> GetVector(const std::string &str) const;
98
99 std::vector<std::string> ToStrings(const void *src/*, size_t size*/) const;
100 void ToFits(void* dest, const void* src, size_t size) const;
101
102 std::vector<char> ToFits(const void* src, size_t size) const;
103
104 static std::string ToFormat(const std::vector<std::string> &fits);
105
106 template<typename T>
107 static std::string GetHex(const void *dat, size_t size, size_t col=0, bool prefix=true)
108 {
109 if (size%sizeof(T)!=0)
110 throw std::runtime_error("GetHex: Total not dividable by typesize.");
111
112 const T *ptr = reinterpret_cast<const T*>(dat);
113
114 std::ostringstream text;
115 text << std::hex;
116
117 const size_t w = nearbyint(ceil(log2(size+1)))/4+1;
118
119 for (size_t i=0; i<size/sizeof(T); i++)
120 {
121 if (prefix && col!=0 && i%col==0)
122 text << std::setfill('0') << std::setw(w) << i << "| ";
123
124 text << std::setfill('0') << std::setw(2*sizeof(T));
125 text << (unsigned int)ptr[i] << ':';
126
127 if (col!=0 && i%col==col-1)
128 text << '\n';
129
130 }
131
132 return text.str();
133 }
134
135 template<typename T, typename S>
136 static std::string GetHex(const S &s, size_t col=0, bool prefix=true)
137 {
138 return GetHex<T>(&s, sizeof(S), col, prefix);
139 }
140
141 void Print(std::ostream &out) const;
142 void Print() const;
143
144 static std::vector<std::string> Regex(const std::string &expr, const std::string &line);
145};
146
147#endif
148
149// ***************************************************************************
150/** @template GetHex(const void *dat, size_t size, size_t col, bool prefix)
151
152Converts from a binary block into a hex representation.
153
154@param dat
155 Pointer to the data block
156
157@param size
158 Size of the data block (in bytes)
159
160@param col
161 Number of columns before new line (zero <default> to write a
162 continous stream
163
164@param prefix
165 Boolean which defines whether each line should be prefixed with a counter,
166 the default is true. It is ignored if col==0
167
168@tparam T
169 type to which the data should be converted. Most usefull types are
170 unsigned byte, unsigned short, unsigned int, uint8_t, uint16_t, ...
171
172@returns
173 The string
174
175**/
176// ***************************************************************************
Note: See TracBrowser for help on using the repository browser.