Macros.h
1 /* Distributed under the Apache License, Version 2.0.
2  See accompanying NOTICE file for details.*/
3 
4 #pragma once
5 
6 #define MIN(A,B) (((A) < (B)) ? (A) : (B))
7 #define MAX(A,B) (((A) > (B)) ? (A) : (B))
8 #define BLIM(input,min,max) (input = (input>max)?max:((input<min)?min:input))
9 #define LLIM(input,min) (input = (input<min)?min:input)
10 #define ULIM(input,max) (input = (input>max)?max:input)
11 #define LIMIT(A,B,C) (((A) < (B)) ? (B) : (((A) > (C)) ? (C) : (A)))
12 
13 template <class _InIt>
14 inline size_t _Hash_value(_InIt _Begin, _InIt _End)
15 { // hash range of elements
16  size_t _Val = 2166136261U;
17 
18  while (_Begin != _End)
19  _Val = 16777619U * _Val ^ (size_t)*_Begin++;
20  return (_Val);
21 }
22 
23 /* The following warnings have been disabled while building the protobuf libraries and compiler. You may have to disable some of them in your own project as well, or live with them.
24  C4018 - 'expression' : signed/unsigned mismatch
25  C4146 - unary minus operator applied to unsigned type, result still unsigned
26  C4244 - Conversion from 'type1' to 'type2', possible loss of data.
27  C4251 - 'identifier' : class 'type' needs to have dll-interface to be used by clients of class 'type2'
28  C4267 - Conversion from 'size_t' to 'type', possible loss of data.
29  C4305 - 'identifier' : truncation from 'type1' to 'type2'
30  C4355 - 'this' : used in base member initializer list
31  C4800 - 'type' : forcing value to bool 'true' or 'false' (performance warning)
32  C4996 - 'function': was declared deprecated
33 */
34 
35 #define DEFINE_STATIC_STRING(name) static constexpr char const* name = #name;
36 #define DEFINE_STATIC_STRING_EX(name,value) static constexpr char const* name = #value;
37 
38 #define SAFE_DELETE(obj) {delete obj; obj=nullptr;}
39 #define SAFE_DELETE_VECTOR(vec) {for(auto i:vec) delete i; vec.clear();}
40 #define SAFE_DELETE_ARRAY(ary) {delete [] ary; *ary=nullptr;}
41 
42 #define INVALIDATE_PROPERTY(name) \
43  if(name!=nullptr) \
44  name->Invalidate();
45 
46 #define FORCE_INVALIDATE_PROPERTY(name) \
47  if(name!=nullptr) \
48  name->ForceInvalidate();
49 
50 #define ZERO_SCALAR(name) \
51  if(name!=nullptr && name->IsValid()) \
52  name->SetValue(0);
53 
54 #define ZERO_UNIT_SCALAR(name) \
55  if(name!=nullptr && name->IsValid()) \
56  name->SetValue(0,*name->GetUnit());
57 
58 #define COPY_PROPERTY(name) \
59  if(from.Has##name()) \
60  Get##name().Set(*from.m_##name);
61 
62 #define MERGE_CHILD_SUBS(name, subMgr) \
63  if(from.Has##name()) \
64  Get##name().Merge(*from.m_##name, subMgr);
65 
66 #define MERGE_CHILD(name) \
67  if(from.Has##name()) \
68  Get##name().Merge(*from.m_##name);
69 
70 #define CDM_COPY(clazz, from, to) \
71  { \
72  auto* bind = clazz ::Unload(*from); \
73  clazz ::Load(*bind,*to); \
74  delete bind; \
75  }
76 
77 template<class T>
78 inline void Copy(const std::vector<T*>& from, std::vector<T*>& to)
79 {
80  to.clear();
81  to.resize(from.size());
82  std::copy(from.begin(), from.end(), to.begin());
83 }
84 
85 template<class T>
86 inline void Copy(const std::vector<T>& from, std::vector<T>& to)
87 {
88  to.clear();
89  to.resize(from.size());
90  std::copy(from.begin(), from.end(), to.begin());
91 }
92 
93 template<class T>
94 inline bool Contains(const std::vector<T*>& v, T& item)
95 {
96  return std::find(v.begin(), v.end(), &item) != v.end();
97 }
98 
99 template<class T>
100 inline void Remove(std::vector<T*>& v, T* item)
101 {
102  v.erase(std::remove(v.begin(), v.end(), item), v.end());
103 }
104 
105 template<class T>
106 inline void Copy(const std::vector<T*>& from, std::vector<const T*>& to)
107 {
108  to.clear();
109  for (auto i : from)
110  to.push_back(i);
111 }
112 
113 template<class T>
114 inline void DELETE_VECTOR(std::vector<T>& vec)
115 {
116  for(unsigned int i=0; i<vec.size(); i++)
117  {
118  delete vec.at(i);
119  }
120  vec.clear();
121 }
122 //This will delete all of the second items in a map and then clear the map to destroy all dangling pointers
123 template<class T, class K>
124 inline void DELETE_MAP_SECOND(std::map<T,K>& map)
125 {
126  for(typename std::map<T,K>::iterator it=map.begin(); it != map.end(); ++it)
127  {
128  delete it->second;
129  }
130  map.clear();
131 }
132 
133 template <typename valueType>
134 bool SameSign(valueType x, valueType y)
135 {
136  return (x >= 0) ^ (y < 0);
137 }

Distributed under the Apache License, Version 2.0.

See accompanying NOTICE file for details.