Marine Library  1.0
C++ library for Linux Networking Development
All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Macros Pages
template.hh
1 #ifndef DOZERG_TEMPLATE_H_20091226
2 #define DOZERG_TEMPLATE_H_20091226
3 
4 /*
5  CTypeTraits
6  CByteOrderTraits
7  COmitCV
8  ARRAY_SIZE
9  STATIC_ASSERT
10  CHECK_TYPE_SIZE
11  CHECK_MEM_OFFSET
12 //*/
13 
14 #include <byteswap.h> //bswap_16, bswap_32, bswap_64
15 #include <functional> //std::unary_function
16 #include <string>
17 #include "impl/template_impl.hh"
18 
19 NS_SERVER_BEGIN
20 
21 //struct CTypeTraits
22 template<typename Integer>
24 {
25  typedef NS_IMPL::CFalseType __IsInteger;
26  static const bool kCanMemcpy = false;
27  static const bool kIsChar = false;
28 };
29 
30 template<class T>
31 struct CTypeTraits<T *>
32 {
33  typedef NS_IMPL::CFalseType __IsInteger;
34  typedef T * __Unsigned;
35  static const bool kCanMemcpy = true;
36  static const int kMaxBits = sizeof(T *) * 8;
37 };
38 
39 template<>
40 struct CTypeTraits<wchar_t>
41 {
42  typedef NS_IMPL::CTrueType __IsInteger;
43  static const bool kCanMemcpy = true;
44  static const int kMaxBits = sizeof(wchar_t) * 8;
45 };
46 
47 template<>
48 struct CTypeTraits<bool>
49 {
50  typedef NS_IMPL::CTrueType __IsInteger;
51  static const bool kCanMemcpy = true;
52  static const int kMaxBits = sizeof(bool) * 8;
53 };
54 
55 #define __INTEGER_TRAITS_FOR_POD(TYPE, IS_CHAR, SIGNED, UNSIGNED) template<>struct CTypeTraits<TYPE>{ \
56  typedef NS_IMPL::CTrueType __IsInteger; \
57  typedef SIGNED __Signed; \
58  typedef UNSIGNED __Unsigned; \
59  static const bool kCanMemcpy = true; \
60  static const bool kIsChar = IS_CHAR; \
61  static const int kMaxBits = sizeof(TYPE) * 8; \
62 }
63 
64 __INTEGER_TRAITS_FOR_POD(char, true, char, unsigned char);
65 __INTEGER_TRAITS_FOR_POD(signed char, true, signed char, unsigned char);
66 __INTEGER_TRAITS_FOR_POD(unsigned char, true, signed char, unsigned char);
67 __INTEGER_TRAITS_FOR_POD(short, false, short, unsigned short);
68 __INTEGER_TRAITS_FOR_POD(unsigned short, false, short, unsigned short);
69 __INTEGER_TRAITS_FOR_POD(int, false, int, unsigned int);
70 __INTEGER_TRAITS_FOR_POD(unsigned int, false, int, unsigned int);
71 __INTEGER_TRAITS_FOR_POD(long, false, long, unsigned long);
72 __INTEGER_TRAITS_FOR_POD(unsigned long, false, long, unsigned long);
73 __INTEGER_TRAITS_FOR_POD(long long, false, long long, unsigned long long);
74 __INTEGER_TRAITS_FOR_POD(unsigned long long, false, long long, unsigned long long);
75 
76 #undef __INTEGER_TRAITS_FOR_POD
77 
78 //ת�ֽ�����ѡ����
79 template<typename T, size_t N>
81 
82 template<typename T>
83 struct CByteOrderTraits<T, 1>
84 {
85  inline static T swap(T a){return a;}
86 };
87 
88 template<typename T>
89 struct CByteOrderTraits<T, 2>
90 {
91  inline static T swap(T a){return bswap_16(a);}
92 };
93 
94 template<typename T>
95 struct CByteOrderTraits<T, 4>
96 {
97  inline static T swap(T a){return bswap_32(a);}
98 };
99 
100 template<typename T>
101 struct CByteOrderTraits<T, 8>
102 {
103  inline static T swap(T a){return bswap_64(a);}
104 };
105 
106 //ȥ�����͵�const��volatile����
107 //TODO:unit test
108 template<class T>
109 struct COmitCV
110 {
111  typedef T result_type;
112 };
113 
114 template<class T>
115 struct COmitCV<const T>
116 {
117  typedef T result_type;
118 };
119 
120 template<class T>
121 struct COmitCV<volatile T>
122 {
123  typedef T result_type;
124 };
125 
126 template<class T>
127 struct COmitCV<const volatile T>
128 {
129  typedef T result_type;
130 };
131 
132 //�����ڻ�ȡ����Ԫ�ظ���#define ARRAY_SIZE(a) sizeof(NS_SERVER::NS_IMPL::__array_size(a)) //from google protobuf(google/protobuf/stubs/common.h) //#define ARRAY_SIZE(a) ((sizeof(a) / sizeof(*(a))) / static_cast<size_t>(!(sizeof(a) % sizeof(*(a))))) //compilation assertion #define STATIC_ASSERT( expr ) __STATIC_ASSERT( JOIN_TOKEN(compile_assert_failed_at_line_, __LINE__), (expr) ) //check type size #define CHECK_TYPE_SIZE( type, size ) __STATIC_ASSERT( size_of_type_is_not_##size, sizeof(type) == (size) ) //�����ڼ��ṹ���Ա��ƫ�� #define CHECK_MEM_OFFSET(type, member, value) __STATIC_ASSERT(offset_of_##member##_in_##type##_is_##value, __builtin_offsetof(type, member) == size_t(value)) //����ѡ���� //TODO: unit test template<class T1, class T2, bool Sel> struct CTypeSelector { typedef T1 result_type; }; template<class T1, class T2> struct CTypeSelector<T1, T2, false> { typedef T2 result_type; }; //CIdentity //TODO:unit test template<class T> struct CIdentity : public std::unary_function<T, T> { T & operator()(T & v) const{return v;} const T & operator()(const T & v) const{return v;} }; //hash�������� //TODO:unit test template<class Key> struct CHashFn: public std::unary_function<Key, size_t>{}; #define __HASH_FUNCIONT_FOR_TYPE(TYPE, HASH) \ template<>struct CHashFn<TYPE> : public std::unary_function<TYPE, size_t>{ \ size_t operator()(TYPE v) const{return (HASH);}} __HASH_FUNCIONT_FOR_TYPE(char *, NS_IMPL::__stl_hash_string(v)); __HASH_FUNCIONT_FOR_TYPE(const char *, NS_IMPL::__stl_hash_string(v)); __HASH_FUNCIONT_FOR_TYPE(signed char *, NS_IMPL::__stl_hash_string((const char *)v)); __HASH_FUNCIONT_FOR_TYPE(const signed char *, NS_IMPL::__stl_hash_string((const char *)v)); __HASH_FUNCIONT_FOR_TYPE(unsigned char *, NS_IMPL::__stl_hash_string((const char *)v)); __HASH_FUNCIONT_FOR_TYPE(const unsigned char *, NS_IMPL::__stl_hash_string((const char *)v)); __HASH_FUNCIONT_FOR_TYPE(char, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(signed char, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(unsigned char, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(signed short, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(unsigned short, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(signed int, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(unsigned int, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(signed long, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(unsigned long, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(signed long long, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(unsigned long long, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(std::string, NS_IMPL::__stl_hash_string(v.c_str(),v.length())); #undef __HASH_FUNCIONT_FOR_TYPE /* //CSameType template<class T1, class T2> struct CSameType { static const bool kResult = false; }; template<class T> struct CSameType<T, T> { static const bool kResult = true; }; //CSelect1st template<class Pair> struct CSelect1st : public std::unary_function<Pair, typename Pair::first_type> { typename Pair::first_type & operator()(Pair & p) const{ return p.first; } const typename Pair::first_type & operator()(const Pair & p) const { return p.first; } }; */ NS_SERVER_END #endif
133 #define ARRAY_SIZE(a) sizeof(NS_SERVER::NS_IMPL::__array_size(a))
134 
135 //from google protobuf(google/protobuf/stubs/common.h)
136 //#define ARRAY_SIZE(a) ((sizeof(a) / sizeof(*(a))) / static_cast<size_t>(!(sizeof(a) % sizeof(*(a)))))
137 
138 //compilation assertion
139 #define STATIC_ASSERT( expr ) __STATIC_ASSERT( JOIN_TOKEN(compile_assert_failed_at_line_, __LINE__), (expr) )
140 
141 //check type size
142 #define CHECK_TYPE_SIZE( type, size ) __STATIC_ASSERT( size_of_type_is_not_##size, sizeof(type) == (size) )
143 
144 
145 //�����ڼ��ṹ���Ա��ƫ��
146 #define CHECK_MEM_OFFSET(type, member, value) __STATIC_ASSERT(offset_of_##member##_in_##type##_is_##value, __builtin_offsetof(type, member) == size_t(value))
147 
148 //����ѡ����
149 //TODO: unit test
150 template<class T1, class T2, bool Sel>
152 {
153  typedef T1 result_type;
154 };
155 
156 template<class T1, class T2>
157 struct CTypeSelector<T1, T2, false>
158 {
159  typedef T2 result_type;
160 };
161 
162 //CIdentity
163 //TODO:unit test
164 template<class T>
165 struct CIdentity : public std::unary_function<T, T>
166 {
167  T & operator()(T & v) const{return v;}
168  const T & operator()(const T & v) const{return v;}
169 };
170 
171 //hash��������//TODO:unit test template<class Key> struct CHashFn: public std::unary_function<Key, size_t>{}; #define __HASH_FUNCIONT_FOR_TYPE(TYPE, HASH) \ template<>struct CHashFn<TYPE> : public std::unary_function<TYPE, size_t>{ \ size_t operator()(TYPE v) const{return (HASH);}} __HASH_FUNCIONT_FOR_TYPE(char *, NS_IMPL::__stl_hash_string(v)); __HASH_FUNCIONT_FOR_TYPE(const char *, NS_IMPL::__stl_hash_string(v)); __HASH_FUNCIONT_FOR_TYPE(signed char *, NS_IMPL::__stl_hash_string((const char *)v)); __HASH_FUNCIONT_FOR_TYPE(const signed char *, NS_IMPL::__stl_hash_string((const char *)v)); __HASH_FUNCIONT_FOR_TYPE(unsigned char *, NS_IMPL::__stl_hash_string((const char *)v)); __HASH_FUNCIONT_FOR_TYPE(const unsigned char *, NS_IMPL::__stl_hash_string((const char *)v)); __HASH_FUNCIONT_FOR_TYPE(char, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(signed char, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(unsigned char, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(signed short, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(unsigned short, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(signed int, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(unsigned int, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(signed long, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(unsigned long, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(signed long long, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(unsigned long long, size_t(v)); __HASH_FUNCIONT_FOR_TYPE(std::string, NS_IMPL::__stl_hash_string(v.c_str(),v.length())); #undef __HASH_FUNCIONT_FOR_TYPE /* //CSameType template<class T1, class T2> struct CSameType { static const bool kResult = false; }; template<class T> struct CSameType<T, T> { static const bool kResult = true; }; //CSelect1st template<class Pair> struct CSelect1st : public std::unary_function<Pair, typename Pair::first_type> { typename Pair::first_type & operator()(Pair & p) const{ return p.first; } const typename Pair::first_type & operator()(const Pair & p) const { return p.first; } }; */ NS_SERVER_END #endif
172 //TODO:unit test
173 template<class Key>
174 struct CHashFn: public std::unary_function<Key, size_t>{};
175 
176 #define __HASH_FUNCIONT_FOR_TYPE(TYPE, HASH) \
177  template<>struct CHashFn<TYPE> : public std::unary_function<TYPE, size_t>{ \
178  size_t operator()(TYPE v) const{return (HASH);}}
179 
180 __HASH_FUNCIONT_FOR_TYPE(char *, NS_IMPL::__stl_hash_string(v));
181 __HASH_FUNCIONT_FOR_TYPE(const char *, NS_IMPL::__stl_hash_string(v));
182 __HASH_FUNCIONT_FOR_TYPE(signed char *, NS_IMPL::__stl_hash_string((const char *)v));
183 __HASH_FUNCIONT_FOR_TYPE(const signed char *, NS_IMPL::__stl_hash_string((const char *)v));
184 __HASH_FUNCIONT_FOR_TYPE(unsigned char *, NS_IMPL::__stl_hash_string((const char *)v));
185 __HASH_FUNCIONT_FOR_TYPE(const unsigned char *, NS_IMPL::__stl_hash_string((const char *)v));
186 __HASH_FUNCIONT_FOR_TYPE(char, size_t(v));
187 __HASH_FUNCIONT_FOR_TYPE(signed char, size_t(v));
188 __HASH_FUNCIONT_FOR_TYPE(unsigned char, size_t(v));
189 __HASH_FUNCIONT_FOR_TYPE(signed short, size_t(v));
190 __HASH_FUNCIONT_FOR_TYPE(unsigned short, size_t(v));
191 __HASH_FUNCIONT_FOR_TYPE(signed int, size_t(v));
192 __HASH_FUNCIONT_FOR_TYPE(unsigned int, size_t(v));
193 __HASH_FUNCIONT_FOR_TYPE(signed long, size_t(v));
194 __HASH_FUNCIONT_FOR_TYPE(unsigned long, size_t(v));
195 __HASH_FUNCIONT_FOR_TYPE(signed long long, size_t(v));
196 __HASH_FUNCIONT_FOR_TYPE(unsigned long long, size_t(v));
197 __HASH_FUNCIONT_FOR_TYPE(std::string, NS_IMPL::__stl_hash_string(v.c_str(),v.length()));
198 
199 #undef __HASH_FUNCIONT_FOR_TYPE
200 /*
201 //CSameType
202 template<class T1, class T2>
203 struct CSameType
204 {
205  static const bool kResult = false;
206 };
207 
208 template<class T>
209 struct CSameType<T, T>
210 {
211  static const bool kResult = true;
212 };
213 
214 //CSelect1st
215 template<class Pair>
216 struct CSelect1st : public std::unary_function<Pair, typename Pair::first_type>
217 {
218  typename Pair::first_type & operator()(Pair & p) const{
219  return p.first;
220  }
221  const typename Pair::first_type & operator()(const Pair & p) const {
222  return p.first;
223  }
224 };
225 
226 */
227 
228 NS_SERVER_END
229 
230 #endif
Definition: posix_shm_file.hh:10
Definition: template.hh:23
Definition: template.hh:109
Definition: template.hh:165
Definition: template.hh:174
Definition: template.hh:80
Definition: template.hh:151