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

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