Tapkee
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
policy.hpp
Go to the documentation of this file.
1 /* This software is distributed under BSD 3-clause license (see LICENSE file).
2  *
3  * Copyright (c) 2012-2013 Sergey Lisitsyn
4  */
5 
6 #ifndef TAPKEE_POLICY_H_
7 #define TAPKEE_POLICY_H_
8 
9 namespace tapkee
10 {
11 namespace tapkee_internal
12 {
13 
15 {
16  virtual ~TypePolicyBase() {}
17  virtual void copyFromValue(void const*, void**) const = 0;
18  virtual void* getValue(void**) const = 0;
19  virtual void free(void**) const = 0;
20  virtual void clone(void* const*, void**) const = 0;
21  virtual void move(void* const*, void**) const = 0;
22 };
23 
24 template <typename T>
26 {
27  inline virtual void copyFromValue(void const* src, void** dest) const
28  {
29  *dest = new T(*reinterpret_cast<T const*>(src));
30  }
31  inline virtual void* getValue(void** src) const
32  {
33  return *src;
34  }
35  inline virtual void free(void** src) const
36  {
37  if (*src)
38  delete (*reinterpret_cast<T**>(src));
39  *src = NULL;
40  }
41  virtual void clone(void* const* src, void** dest) const
42  {
43  if (*dest)
44  (*reinterpret_cast<T**>(dest))->~T();
45  *dest = new T(**reinterpret_cast<T* const*>(src));
46  }
47  inline virtual void move(void* const* src, void** dest) const
48  {
49  (*reinterpret_cast<T**>(dest))->~T();
50  **reinterpret_cast<T**>(dest) = **reinterpret_cast<T* const*>(src);
51  }
52 };
53 
54 template <typename T>
56 {
57  static PointerTypePolicyImpl<T> policy;
58  return &policy;
59 }
60 
62 {
63  virtual ~CheckerPolicyBase() {}
64  virtual bool isInRange(void* const*, void*, void*) const = 0;
65  virtual bool isEqual(void* const*, void*) const = 0;
66  virtual bool isNotEqual(void* const*, void*) const = 0;
67  virtual bool isPositive(void* const*) const = 0;
68  virtual bool isNonNegative(void * const*) const = 0;
69  virtual bool isNegative(void* const*) const = 0;
70  virtual bool isNonPositive(void * const*) const = 0;
71  virtual bool isGreater(void* const*, void*) const = 0;
72  virtual bool isLesser(void* const*, void*) const = 0;
73 };
74 
75 template <typename T>
77 {
78  virtual bool isInRange(void* const*, void*, void*) const
79  {
80  return false;
81  }
82  virtual bool isEqual(void* const*, void*) const
83  {
84  return false;
85  }
86  virtual bool isNotEqual(void* const*, void*) const
87  {
88  return false;
89  }
90  virtual bool isPositive(void* const*) const
91  {
92  return false;
93  }
94  virtual bool isNonNegative(void* const*) const
95  {
96  return false;
97  }
98  virtual bool isNegative(void* const*) const
99  {
100  return false;
101  }
102  virtual bool isNonPositive(void* const*) const
103  {
104  return false;
105  }
106  virtual bool isGreater(void* const*, void*) const
107  {
108  return false;
109  }
110  virtual bool isLesser(void* const*, void*) const
111  {
112  return false;
113  }
114 };
115 
116 #define default_policy_for(Type) \
117 template <> \
118 struct PointerCheckerPolicyImpl<Type> : public CheckerPolicyBase \
119 { \
120  inline Type value(void* v) const \
121  { \
122  return *reinterpret_cast<Type*>(v); \
123  } \
124  virtual bool isInRange(void* const* src, void* lower, void* upper) const \
125  { \
126  Type v = value(*src); \
127  Type l = value(lower); \
128  Type u = value(upper); \
129  return (v>=l) && (v<u); \
130  } \
131  virtual bool isEqual(void* const* src, void* other_src) const \
132  { \
133  Type v = value(*src); \
134  Type ov = value(other_src); \
135  return (v==ov); \
136  } \
137  virtual bool isNotEqual(void* const* src, void* other_src) const \
138  { \
139  Type v = value(*src); \
140  Type ov = value(other_src); \
141  return (v!=ov); \
142  } \
143  virtual bool isPositive(void* const* src) const \
144  { \
145  Type v = value(*src); \
146  return (v>0); \
147  } \
148  virtual bool isNonNegative(void* const* src) const \
149  { \
150  Type v = value(*src); \
151  return (v>=0); \
152  } \
153  virtual bool isNegative(void* const* src) const \
154  { \
155  Type v = value(*src); \
156  return (v<0); \
157  } \
158  virtual bool isNonPositive(void* const* src) const \
159  { \
160  Type v = value(*src); \
161  return (v<=0); \
162  } \
163  virtual bool isGreater(void* const* src, void* lower) const \
164  { \
165  Type v = value(*src); \
166  return (v>value(lower)); \
167  } \
168  virtual bool isLesser(void* const* src, void* upper) const \
169  { \
170  Type v = value(*src); \
171  return (v<value(upper)); \
172  } \
173 }
174 
178 
179 template <typename T>
181 {
182  static PointerCheckerPolicyImpl<T> policy;
183  return &policy;
184 }
185 
186 }
187 }
188 #endif
virtual bool isLesser(void *const *, void *) const =0
virtual void move(void *const *src, void **dest) const
Definition: policy.hpp:47
virtual bool isNonNegative(void *const *) const
Definition: policy.hpp:94
virtual bool isGreater(void *const *, void *) const
Definition: policy.hpp:106
virtual void free(void **) const =0
virtual void * getValue(void **) const =0
virtual bool isPositive(void *const *) const
Definition: policy.hpp:90
TypePolicyBase * getPolicy()
Definition: policy.hpp:55
virtual bool isNegative(void *const *) const =0
virtual void free(void **src) const
Definition: policy.hpp:35
virtual void clone(void *const *src, void **dest) const
Definition: policy.hpp:41
virtual bool isInRange(void *const *, void *, void *) const
Definition: policy.hpp:78
virtual void move(void *const *, void **) const =0
virtual bool isEqual(void *const *, void *) const
Definition: policy.hpp:82
virtual void * getValue(void **src) const
Definition: policy.hpp:31
virtual bool isNotEqual(void *const *, void *) const =0
virtual bool isNonPositive(void *const *) const =0
virtual void clone(void *const *, void **) const =0
virtual bool isNotEqual(void *const *, void *) const
Definition: policy.hpp:86
virtual void copyFromValue(void const *src, void **dest) const
Definition: policy.hpp:27
virtual bool isNonPositive(void *const *) const
Definition: policy.hpp:102
virtual void copyFromValue(void const *, void **) const =0
virtual bool isNonNegative(void *const *) const =0
virtual bool isPositive(void *const *) const =0
virtual bool isLesser(void *const *, void *) const
Definition: policy.hpp:110
#define default_policy_for(Type)
Definition: policy.hpp:116
virtual bool isNegative(void *const *) const
Definition: policy.hpp:98
virtual bool isInRange(void *const *, void *, void *) const =0
CheckerPolicyBase * getCheckerPolicy()
Definition: policy.hpp:180
virtual bool isEqual(void *const *, void *) const =0
virtual bool isGreater(void *const *, void *) const =0