26 #ifndef SHORE_MISC_MEMOPS_HPP__
27 #define SHORE_MISC_MEMOPS_HPP__
32 #include <boost/cstdint.hpp>
34 #if defined (__GLIBC__)
36 # if (__BYTE_ORDER == __LITTLE_ENDIAN)
37 # define SHORE_MEMOPS_IS_LITTLE_ENDIAN
38 # elif (__BYTE_ORDER == __BIG_ENDIAN)
39 # define SHORE_MEMOPS_IS_BIG_ENDIAN
41 # error Unsupported machine endianness.
43 #elif defined(_BIG_ENDIAN) && !defined(_LITTLE_ENDIAN)
44 # define SHORE_MEMOPS_IS_BIG_ENDIAN
45 #elif defined(_LITTLE_ENDIAN) && !defined(_BIG_ENDIAN)
46 # define SHORE_MEMOPS_IS_LITTLE_ENDIAN
47 #elif defined(__sparc) || defined(__sparc__) \
48 || defined(_POWER) || defined(__powerpc__) \
49 || defined(__ppc__) || defined(__hpux) || defined(__hppa) \
50 || defined(_MIPSEB) || defined(_POWER) \
52 # define SHORE_MEMOPS_IS_BIG_ENDIAN
53 #elif defined(__i386__) || defined(__alpha__) \
54 || defined(__ia64) || defined(__ia64__) \
55 || defined(_M_IX86) || defined(_M_IA64) \
56 || defined(_M_ALPHA) || defined(__amd64) \
57 || defined(__amd64__) || defined(_M_AMD64) \
58 || defined(__x86_64) || defined(__x86_64__) \
59 || defined(_M_X64) || defined(__bfin__)
60 # define SHORE_MEMOPS_IS_LITTLE_ENDIAN
62 # error Cannot determine endianness endianness.
67 typedef boost::uint8_t uint8_t;
68 typedef boost::uint16_t uint16_t;
69 typedef boost::uint32_t uint32_t;
70 typedef boost::uint64_t uint64_t;
73 template<
class T,
int SZ>
80 template<
class T,
int SZ>
81 T*
end(T (&array)[SZ])
83 return array+
size(array);
87 std::ostream &
memdump(std::ostream& os,
const void* src,
size_t n);
91 void*
const dst,
const void*
const src,
const size_t nbits,
92 const size_t dst_bitofs,
const size_t src_bitofs=0);
94 #ifndef SHORE_MEMOPS_IS_BIG_ENDIAN
97 inline uint64_t
ntoh64(
const void*
const netw64)
100 reinterpret_cast<char*
>(&ret)[0]=static_cast<const char*>(netw64)[7];
101 reinterpret_cast<char*
>(&ret)[1]=static_cast<const char*>(netw64)[6];
102 reinterpret_cast<char*
>(&ret)[2]=static_cast<const char*>(netw64)[5];
103 reinterpret_cast<char*
>(&ret)[3]=static_cast<const char*>(netw64)[4];
104 reinterpret_cast<char*
>(&ret)[4]=static_cast<const char*>(netw64)[3];
105 reinterpret_cast<char*
>(&ret)[5]=static_cast<const char*>(netw64)[2];
106 reinterpret_cast<char*
>(&ret)[6]=static_cast<const char*>(netw64)[1];
107 reinterpret_cast<char*
>(&ret)[7]=static_cast<const char*>(netw64)[0];
112 inline uint32_t
ntoh32(
const void*
const netw32)
115 reinterpret_cast<char*
>(&ret)[0]=static_cast<const char*>(netw32)[3];
116 reinterpret_cast<char*
>(&ret)[1]=static_cast<const char*>(netw32)[2];
117 reinterpret_cast<char*
>(&ret)[2]=static_cast<const char*>(netw32)[1];
118 reinterpret_cast<char*
>(&ret)[3]=static_cast<const char*>(netw32)[0];
123 inline uint16_t
ntoh16(
const void*
const netw16)
126 reinterpret_cast<char*
>(&ret)[0]=static_cast<const char*>(netw16)[1];
127 reinterpret_cast<char*
>(&ret)[1]=static_cast<const char*>(netw16)[0];
132 inline uint64_t
letoh64(
const void*
const le64)
135 reinterpret_cast<char*
>(&ret)[0]=static_cast<const char*>(le64)[0];
136 reinterpret_cast<char*
>(&ret)[1]=static_cast<const char*>(le64)[1];
137 reinterpret_cast<char*
>(&ret)[2]=static_cast<const char*>(le64)[2];
138 reinterpret_cast<char*
>(&ret)[3]=static_cast<const char*>(le64)[3];
139 reinterpret_cast<char*
>(&ret)[4]=static_cast<const char*>(le64)[4];
140 reinterpret_cast<char*
>(&ret)[5]=static_cast<const char*>(le64)[5];
141 reinterpret_cast<char*
>(&ret)[6]=static_cast<const char*>(le64)[6];
142 reinterpret_cast<char*
>(&ret)[7]=static_cast<const char*>(le64)[7];
147 inline uint32_t
letoh32(
const void*
const le32)
150 reinterpret_cast<char*
>(&ret)[0]=static_cast<const char*>(le32)[0];
151 reinterpret_cast<char*
>(&ret)[1]=static_cast<const char*>(le32)[1];
152 reinterpret_cast<char*
>(&ret)[2]=static_cast<const char*>(le32)[2];
153 reinterpret_cast<char*
>(&ret)[3]=static_cast<const char*>(le32)[3];
158 inline uint16_t
letoh16(
const void*
const le16)
161 reinterpret_cast<char*
>(&ret)[0]=static_cast<const char*>(le16)[0];
162 reinterpret_cast<char*
>(&ret)[1]=static_cast<const char*>(le16)[1];
166 #else // SHORE_MEMOPS_IS_BIG_ENDIAN
169 inline uint64_t
ntoh64(
const void*
const netw64)
172 reinterpret_cast<char*
>(&ret)[0]=static_cast<const char*>(netw64)[0];
173 reinterpret_cast<char*
>(&ret)[1]=static_cast<const char*>(netw64)[1];
174 reinterpret_cast<char*
>(&ret)[2]=static_cast<const char*>(netw64)[2];
175 reinterpret_cast<char*
>(&ret)[3]=static_cast<const char*>(netw64)[3];
176 reinterpret_cast<char*
>(&ret)[4]=static_cast<const char*>(netw64)[4];
177 reinterpret_cast<char*
>(&ret)[5]=static_cast<const char*>(netw64)[5];
178 reinterpret_cast<char*
>(&ret)[6]=static_cast<const char*>(netw64)[6];
179 reinterpret_cast<char*
>(&ret)[7]=static_cast<const char*>(netw64)[7];
184 inline uint32_t
ntoh32(
const void*
const netw32)
187 reinterpret_cast<char*
>(&ret)[0]=static_cast<const char*>(netw32)[0];
188 reinterpret_cast<char*
>(&ret)[1]=static_cast<const char*>(netw32)[1];
189 reinterpret_cast<char*
>(&ret)[2]=static_cast<const char*>(netw32)[2];
190 reinterpret_cast<char*
>(&ret)[3]=static_cast<const char*>(netw32)[3];
195 inline uint16_t
ntoh16(
const void*
const netw16)
198 reinterpret_cast<char*
>(&ret)[0]=static_cast<const char*>(netw16)[0];
199 reinterpret_cast<char*
>(&ret)[1]=static_cast<const char*>(netw16)[1];
204 inline uint64_t
letoh64(
const void*
const netw64)
207 reinterpret_cast<char*
>(&ret)[0]=static_cast<const char*>(netw64)[7];
208 reinterpret_cast<char*
>(&ret)[1]=static_cast<const char*>(netw64)[6];
209 reinterpret_cast<char*
>(&ret)[2]=static_cast<const char*>(netw64)[5];
210 reinterpret_cast<char*
>(&ret)[3]=static_cast<const char*>(netw64)[4];
211 reinterpret_cast<char*
>(&ret)[4]=static_cast<const char*>(netw64)[3];
212 reinterpret_cast<char*
>(&ret)[5]=static_cast<const char*>(netw64)[2];
213 reinterpret_cast<char*
>(&ret)[6]=static_cast<const char*>(netw64)[1];
214 reinterpret_cast<char*
>(&ret)[7]=static_cast<const char*>(netw64)[0];
219 inline uint32_t
letoh32(
const void*
const le32)
222 reinterpret_cast<char*
>(&ret)[0]=static_cast<const char*>(le32)[3];
223 reinterpret_cast<char*
>(&ret)[1]=static_cast<const char*>(le32)[2];
224 reinterpret_cast<char*
>(&ret)[2]=static_cast<const char*>(le32)[1];
225 reinterpret_cast<char*
>(&ret)[3]=static_cast<const char*>(le32)[0];
230 inline uint16_t
letoh16(
const void*
const le16)
233 reinterpret_cast<char*
>(&ret)[0]=static_cast<const char*>(le16)[1];
234 reinterpret_cast<char*
>(&ret)[1]=static_cast<const char*>(le16)[0];
238 #endif // SHORE_MEMOPS_IS_BIG_ENDIAN
241 inline uint64_t
hton64(
const void*
const host64)
247 inline uint32_t
hton32(
const void*
const host32)
253 inline uint16_t
hton16(
const void*
const host16)
265 virtual ~ptrbase() {}
274 ptrwrap(T* d): data(d) {}
281 std::vector<ptrbase*> m_pointers;
287 template<
typename Iterator>
300 T &push_back(T*
const ptr)
302 m_pointers.push_back(
new ptrwrap<T>(ptr));
307 T &operator()(T*
const ptr)
309 return push_back(ptr);
320 std::string m_filename;
323 std::streamsize m_filesize;
325 std::streamoff m_offset;
326 std::streamsize m_size;
329 std::streamoff m_pa_offset;
331 std::streamsize m_pa_size;
333 std::streamoff m_pa_diff;
344 mmapping(
const std::string &fn=std::string());
365 bool has_file()
const;
371 bool is_file_open()
const;
374 void map(
const std::streamoff ofs,
const std::streamsize
size=0);
389 const char *
begin()
const;
395 const char *
end()
const;
406 unsigned char *m_sig;
415 void process(
const char *
const data,
const size_t n);
419 const std::string &
value()
const;
422 static std::string
digest(
const std::string &str);
427 #endif // SHORE_MISC_MEMOPS_HPP__