HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
UN_Types.h
Go to the documentation of this file.
1 /*
2  * PROPRIETARY INFORMATION. This software is proprietary to
3  * Side Effects Software Inc., and is not to be reproduced,
4  * transmitted, or disclosed in any way without written permission.
5  *
6  * NAME: UN_Types.h ( UN Library, C++)
7  *
8  * COMMENTS: Common C++ types used in the UN library.
9  *
10  */
11 
12 #ifndef __UN_Types_h__
13 #define __UN_Types_h__
14 
15 #include "UN_API.h"
16 #include <SYS/SYS_Types.h>
17 #include <SYS/SYS_Hash.h> // For SYShash() use in hash_value().
18 #include <UT/UT_StringHolder.h>
19 #include <UT/UT_Array.h>
20 
21 
22 // TODO: FIXME: Can the data numbers be `int` instead of `int64`?
23 // Will they be different for indexing and for identification?
25 {
26 public:
27  /// A numerical value for indexing into data containers and for
28  /// unique IDs to validate of data objects.
29  ///
30  /// An enum class `ValueType` and `UN_DataNumber` should be interchangeable.
31  /// UN_DataNumber really just provides methods to operate on it and
32  /// the ability to "derive" from it.
33  /// In particular, it should be possible to implicitly cast `ValueType`
34  /// to UN_DataNumber class type.
35  /// It should be possible to implicitly cast this UN_DataNumber class type
36  /// to ValueType since it is an enum class, and therefore
37  /// not implicitly castable to other types such as `exint` or `int`
38  /// (and therefore deemed "safe" without the risk of data narrowing).
40  enum class ValueType : ValueIntType {};
41 
42  /// A numerical value for an invalid data object number.
43  /// It is used in initialization to denote a non-existent, invalid,
44  /// or an unknown data object.
45  /// The value of -1 is consistent in its use as an index into data arrays.
46  static constexpr ValueType INVALID_NUMBER = ValueType(-1);
47 
48  /// A constructor for the data number.
49  /// Note, this is not an explicit constructor to allow asting from
50  /// ValueType to UN_DataNumber. See comment for `ValueType` definition.
52  : myValue( value ) {}
53 
54  /// @{ Returns true if this data number is valid; false otherwise.
55  bool isValid() const
56  { return myValue != INVALID_NUMBER; }
57  explicit operator bool() const
58  { return isValid(); }
59  /// @}
60 
61  /// Sets the numerical value of this number.
63  { myValue = value; }
64 
65  /// Returns the numerical value of this number.
66  ValueType value() const
67  { return myValue; }
68 
69  /// Implicit cast to `ValueType` since it is an enum class.
70  /// See the comment for `ValueType` definition.
71  operator ValueType() const
72  { return value(); }
73 
74  /// Returns an exint value of this number.
75  exint exintValue() const
76  {
78  sizeof(ValueType) == sizeof(exint) );
79  return static_cast<exint>( value() );
80  }
81 
82 
83  /// @{ Comparison operators.
84  bool operator==( const UN_DataNumber &other ) const
85  { return myValue == other.myValue; }
86  bool operator!=( const UN_DataNumber &other ) const
87  { return myValue != other.myValue; }
88  bool operator<( const UN_DataNumber &other ) const
89  { return myValue < other.myValue; }
90  bool operator<=( const UN_DataNumber &other ) const
91  { return myValue <= other.myValue; }
92  bool operator>( const UN_DataNumber &other ) const
93  { return myValue > other.myValue; }
94  bool operator>=( const UN_DataNumber &other ) const
95  { return myValue >= other.myValue; }
96  /// @}
97 
98  /// @{ Basic arithmetic operators.
100  {
101  myValue = ValueType( ValueIntType(myValue) + 1);
102  return *this;
103  }
105  {
106  UN_DataNumber tmp( *this );
107  myValue = ValueType( ValueIntType(myValue) + 1);
108  return tmp;
109  }
110  /// @}
111 
112  /// Hash function for use of UN_DataNumber as a key in the UT_Map class.
113  friend size_t hash_value( const UN_DataNumber &data_number )
114  { return SYShash( data_number.value() ); }
115 
116 private:
117  /// The value of the data number.
118  ValueType myValue;
119 };
120 
121 
122 /// A type denoting the size of data arrays indexed with UN_DataIndex.
124 {
125 public:
127  : UN_DataNumber( value ) {}
128 
129  /// An exint is used for UT_Array sizes, and UN_DataSize represents
130  /// such size, so these types should be interchangeable.
131  /// Thus providing a constructor from exint.
132  explicit UN_DataSize( exint value )
133  : UN_DataNumber( static_cast<ValueType>( value ))
134  { SYS_STATIC_ASSERT( sizeof(value) == sizeof(ValueType) ); }
135 
136  /// Implicit cast to `exint` for sizing arrays (eg, UT_Array).
137  operator exint() const
138  { return exintValue(); }
139 };
140 
141 
142 /// An index into a data container, referring to a particular data object.
143 /// Indices may be reused for new data objects, if old objects were deleted.
145 {
146 public:
148  : UN_DataNumber( value ) {}
149 
150  /// For past-end array index.
152  : UN_DataNumber( size ) {}
153 
154  /// An exint is used for indexing into UT_Array, and UN_DataIndex represents
155  /// such index, so these types should be interchangeable.
156  /// Thus providing a constructor from exint.
158  : UN_DataNumber( static_cast<ValueType>( value ))
159  { SYS_STATIC_ASSERT( sizeof(value) == sizeof(ValueType) ); }
160 
161  /// Resets the index to an invalid value.
162  void clear()
163  { setValue( INVALID_NUMBER ); }
164 
165  /// Implicit cast to `exint` for indexing into arrays (eg, UT_Array).
166  operator exint() const
167  { return exintValue(); }
168 };
169 
170 
171 /// An index into a data container, referring to a data object.
172 /// Indices may be reused for new data objects, if old ones were deleted.
173 #define UN_DATA_INDEX(Class) \
174 class Class : public UN_DataIndex \
175 { \
176 public: \
177  explicit Class( UN_DataIndex data_index = UN_DataIndex() ) \
178  : UN_DataIndex( data_index ) {} \
179 }; \
180  \
181 using Class##List = UT_Array< Class >; \
182 
183 UN_DATA_INDEX( UN_NodeIndex )
184 UN_DATA_INDEX( UN_ParmIndex )
185 UN_DATA_INDEX( UN_PortIndex )
186 UN_DATA_INDEX( UN_WireIndex )
187 UN_DATA_INDEX( UN_MetaDataIndex )
188 UN_DATA_INDEX( UN_SubnetIndex )
189 
190 
191 /// A unique identifier of a particular data object.
192 /// Data objects of the same type (eg, nodes or ports) are assigned a unique ID
193 /// in a given graph, and no two data objects of that type share same ID,
194 /// withing the lifespan of the given graph.
195 /// Ie, unlike indices, the IDs are not reused for new data objects,
196 /// even if some old objects were deleted.
198 {
199 public:
200  explicit UN_DataID( ValueType value = INVALID_NUMBER )
201  : UN_DataNumber( value ) {}
202 
203  // Convenience constructor to create an ID from an exint value.
204  explicit UN_DataID( exint value )
205  : UN_DataNumber( static_cast<ValueType>( value ))
206  { SYS_STATIC_ASSERT( sizeof(value) == sizeof(ValueType) ); }
207 };
208 
209 /// A list of data IDs.
211 
212 
213 /// Data ID is unique throughout the lifespan of a graph, but only for
214 /// within the same data class (eg, nodes). Ie, a node may have same data id
215 /// as a wire. So it's a good idea to keep these type spaces separate.
216 /// Defines types for various data ID numbers.
217 
218 #define UN_DATA_ID( Class ) \
219 class Class : public UN_DataID \
220 { \
221 public: \
222  explicit Class( UN_DataID data_id = UN_DataID() ) \
223  : UN_DataID( data_id ) {} \
224 }; \
225  \
226 using Class##List = UT_Array< Class >; \
227 
228 UN_DATA_ID( UN_NodeID )
229 UN_DATA_ID( UN_ParmID )
230 UN_DATA_ID( UN_PortID )
231 UN_DATA_ID( UN_WireID )
232 UN_DATA_ID( UN_MetaDataID )
233 UN_DATA_ID( UN_SubnetID )
234 
235 
236 /// For debug printouts, etc:
237 #define UN_NUMBER_FORMATTER(IdOrIndexType) \
238 inline size_t format(char *buffer, size_t buffer_size, const IdOrIndexType &v) \
239 { \
240  UT::Format::Writer w(buffer, buffer_size); \
241  UT::Format::Formatter f; \
242  return f.format(w, #IdOrIndexType "({})", {v.exintValue()}); \
243 } \
244 
245 UN_NUMBER_FORMATTER( UN_NodeID )
246 UN_NUMBER_FORMATTER( UN_ParmID )
247 UN_NUMBER_FORMATTER( UN_PortID )
248 UN_NUMBER_FORMATTER( UN_WireID )
249 UN_NUMBER_FORMATTER( UN_MetaDataID )
250 UN_NUMBER_FORMATTER( UN_SubnetID )
251 
252 
253 UN_NUMBER_FORMATTER( UN_NodeIndex )
254 UN_NUMBER_FORMATTER( UN_ParmIndex )
255 UN_NUMBER_FORMATTER( UN_PortIndex )
256 UN_NUMBER_FORMATTER( UN_WireIndex )
257 UN_NUMBER_FORMATTER( UN_MetaDataIndex )
258 UN_NUMBER_FORMATTER( UN_SubnetIndex )
259 
260 
261 // Needed for data IDs and indices in UT_ArrayMap and UT_ArraySet classes.
262 namespace UT
263 {
264  template <typename T> struct DefaultClearer;
265 
266 
267  template <>
269  {
270  static void clear( UN_DataID &v ) { v = UN_DataID(); }
271  static bool isClear( const UN_DataID &v ) { return !v.isValid(); }
272  static void clearConstruct( UN_DataID *p ) { clear(*p); }
273  static const bool clearNeedsDestruction = false;
274  };
275 
276 #define UN_ID_CLEARER(ID) \
277  template <> struct DefaultClearer<ID> : public DefaultClearer<UN_DataID> {};
278 
279  UN_ID_CLEARER( UN_NodeID )
280  UN_ID_CLEARER( UN_ParmID )
281  UN_ID_CLEARER( UN_PortID )
282  UN_ID_CLEARER( UN_WireID )
283  UN_ID_CLEARER( UN_SubnetID )
284 
285 
286  template <>
288  {
289  static void clear( UN_DataIndex &v ) { v.clear(); }
290  static bool isClear( const UN_DataIndex &v ) { return !v.isValid(); }
291  static void clearConstruct( UN_DataIndex *p ) { clear(*p); }
292  static const bool clearNeedsDestruction = false;
293  };
294 
295 #define UN_INDEX_CLEARER(ID) \
296  template<> struct DefaultClearer<ID>: public DefaultClearer<UN_DataIndex>{};
297 
298  UN_INDEX_CLEARER( UN_NodeIndex )
299  UN_INDEX_CLEARER( UN_ParmIndex )
300  UN_INDEX_CLEARER( UN_PortIndex )
301  UN_INDEX_CLEARER( UN_WireIndex )
302  UN_INDEX_CLEARER( UN_SubnetIndex )
303 
304 } // end: namespace UT
305 
306 
307 /// Differentiates between input and output ports.
309 {
310  Invalid, // Unknown port kind; used for uninitialized state or errors.
311  Input, // Represents an input port.
312  Output // Represents an output port.
313 };
314 
315 
316 /// Unknown or undefined port type name: an empty string.
317 static constexpr UT_StringLit UN_UNDEFINED_PORT_TYPE_NAME;
318 
319 
320 /// Unknown or undefined parameter type name: an empty string.
321 static constexpr UT_StringLit UN_UNDEFINED_PARM_TYPE_NAME;
322 
323 
324 /// Returns true if the given type name is invalid; false otherwise;
325 static inline bool UNisValid( const UT_StringRef &type_name )
326  { return type_name.isstring(); }
327 
328 #endif
329 
#define SYS_STATIC_ASSERT(expr)
static bool isClear(const UN_DataIndex &v)
Definition: UN_Types.h:290
exint exintValue() const
Returns an exint value of this number.
Definition: UN_Types.h:75
void clear()
Resets the index to an invalid value.
Definition: UN_Types.h:162
*get result *(waiting if necessary)*A common idiom is to fire a bunch of sub tasks at the and then *wait for them to all complete We provide a helper class
Definition: thread.h:623
ValueType value() const
Returns the numerical value of this number.
Definition: UN_Types.h:66
UN_DataNumber & operator++()
Basic arithmetic operators.
Definition: UN_Types.h:99
UN_DataIndex(ValueType value=INVALID_NUMBER)
Definition: UN_Types.h:147
const GLdouble * v
Definition: glcorearb.h:837
UN_PortKind
Differentiates between input and output ports.
Definition: UN_Types.h:308
friend size_t hash_value(const UN_DataNumber &data_number)
Hash function for use of UN_DataNumber as a key in the UT_Map class.
Definition: UN_Types.h:113
int64 exint
Definition: SYS_Types.h:125
static void clearConstruct(UN_DataIndex *p)
Definition: UN_Types.h:291
#define UN_NUMBER_FORMATTER(IdOrIndexType)
For debug printouts, etc:
Definition: UN_Types.h:237
bool operator>=(const UN_DataNumber &other) const
Comparison operators.
Definition: UN_Types.h:94
exint ValueIntType
Definition: UN_Types.h:39
static void clearConstruct(UN_DataID *p)
Definition: UN_Types.h:272
static bool isClear(const UN_DataID &v)
Definition: UN_Types.h:271
bool isValid() const
Returns true if this data number is valid; false otherwise.
Definition: UN_Types.h:55
UN_DataNumber operator++(int)
Basic arithmetic operators.
Definition: UN_Types.h:104
bool operator>(const UN_DataNumber &other) const
Comparison operators.
Definition: UN_Types.h:92
constexpr std::enable_if< I< type_count_base< T >::value, int >::type tuple_type_size(){return subtype_count< typename std::tuple_element< I, T >::type >::value+tuple_type_size< T, I+1 >);}template< typename T > struct type_count< T, typename std::enable_if< is_tuple_like< T >::value >::type >{static constexpr int value{tuple_type_size< T, 0 >)};};template< typename T > struct subtype_count{static constexpr int value{is_mutable_container< T >::value?expected_max_vector_size:type_count< T >::value};};template< typename T, typename Enable=void > struct type_count_min{static const int value{0};};template< typename T >struct type_count_min< T, typename std::enable_if<!is_mutable_container< T >::value &&!is_tuple_like< T >::value &&!is_wrapper< T >::value &&!is_complex< T >::value &&!std::is_void< T >::value >::type >{static constexpr int value{type_count< T >::value};};template< typename T > struct type_count_min< T, typename std::enable_if< is_complex< T >::value >::type >{static constexpr int value{1};};template< typename T >struct type_count_min< T, typename std::enable_if< is_wrapper< T >::value &&!is_complex< T >::value &&!is_tuple_like< T >::value >::type >{static constexpr int value{subtype_count_min< typename T::value_type >::value};};template< typename T, std::size_t I >constexpr typename std::enable_if< I==type_count_base< T >::value, int >::type tuple_type_size_min(){return 0;}template< typename T, std::size_t I > constexpr typename std::enable_if< I< type_count_base< T >::value, int >::type tuple_type_size_min(){return subtype_count_min< typename std::tuple_element< I, T >::type >::value+tuple_type_size_min< T, I+1 >);}template< typename T > struct type_count_min< T, typename std::enable_if< is_tuple_like< T >::value >::type >{static constexpr int value{tuple_type_size_min< T, 0 >)};};template< typename T > struct subtype_count_min{static constexpr int value{is_mutable_container< T >::value?((type_count< T >::value< expected_max_vector_size)?type_count< T >::value:0):type_count_min< T >::value};};template< typename T, typename Enable=void > struct expected_count{static const int value{0};};template< typename T >struct expected_count< T, typename std::enable_if<!is_mutable_container< T >::value &&!is_wrapper< T >::value &&!std::is_void< T >::value >::type >{static constexpr int value{1};};template< typename T > struct expected_count< T, typename std::enable_if< is_mutable_container< T >::value >::type >{static constexpr int value{expected_max_vector_size};};template< typename T >struct expected_count< T, typename std::enable_if<!is_mutable_container< T >::value &&is_wrapper< T >::value >::type >{static constexpr int value{expected_count< typename T::value_type >::value};};enum class object_category:int{char_value=1, integral_value=2, unsigned_integral=4, enumeration=6, boolean_value=8, floating_point=10, number_constructible=12, double_constructible=14, integer_constructible=16, string_assignable=23, string_constructible=24, other=45, wrapper_value=50, complex_number=60, tuple_value=70, container_value=80,};template< typename T, typename Enable=void > struct classify_object{static constexpr object_category value{object_category::other};};template< typename T >struct classify_object< T, typename std::enable_if< std::is_integral< T >::value &&!std::is_same< T, char >::value &&std::is_signed< T >::value &&!is_bool< T >::value &&!std::is_enum< T >::value >::type >{static constexpr object_category value{object_category::integral_value};};template< typename T >struct classify_object< T, typename std::enable_if< std::is_integral< T >::value &&std::is_unsigned< T >::value &&!std::is_same< T, char >::value &&!is_bool< T >::value >::type >{static constexpr object_category value{object_category::unsigned_integral};};template< typename T >struct classify_object< T, typename std::enable_if< std::is_same< T, char >::value &&!std::is_enum< T >::value >::type >{static constexpr object_category value{object_category::char_value};};template< typename T > struct classify_object< T, typename std::enable_if< is_bool< T >::value >::type >{static constexpr object_category value{object_category::boolean_value};};template< typename T > struct classify_object< T, typename std::enable_if< std::is_floating_point< T >::value >::type >{static constexpr object_category value{object_category::floating_point};};template< typename T >struct classify_object< T, typename std::enable_if<!std::is_floating_point< T >::value &&!std::is_integral< T >::value &&std::is_assignable< T &, std::string >::value >::type >{static constexpr object_category value{object_category::string_assignable};};template< typename T >struct classify_object< T, typename std::enable_if<!std::is_floating_point< T >::value &&!std::is_integral< T >::value &&!std::is_assignable< T &, std::string >::value &&(type_count< T >::value==1)&&std::is_constructible< T, std::string >::value >::type >{static constexpr object_category value{object_category::string_constructible};};template< typename T > struct classify_object< T, typename std::enable_if< std::is_enum< T >::value >::type >{static constexpr object_category value{object_category::enumeration};};template< typename T > struct classify_object< T, typename std::enable_if< is_complex< T >::value >::type >{static constexpr object_category value{object_category::complex_number};};template< typename T > struct uncommon_type{using type=typename std::conditional<!std::is_floating_point< T >::value &&!std::is_integral< T >::value &&!std::is_assignable< T &, std::string >::value &&!std::is_constructible< T, std::string >::value &&!is_complex< T >::value &&!is_mutable_container< T >::value &&!std::is_enum< T >::value, std::true_type, std::false_type >::type;static constexpr bool value=type::value;};template< typename T >struct classify_object< T, typename std::enable_if<(!is_mutable_container< T >::value &&is_wrapper< T >::value &&!is_tuple_like< T >::value &&uncommon_type< T >::value)>::type >{static constexpr object_category value{object_category::wrapper_value};};template< typename T >struct classify_object< T, typename std::enable_if< uncommon_type< T >::value &&type_count< T >::value==1 &&!is_wrapper< T >::value &&is_direct_constructible< T, double >::value &&is_direct_constructible< T, int >::value >::type >{static constexpr object_category value{object_category::number_constructible};};template< typename T >struct classify_object< T, typename std::enable_if< uncommon_type< T >::value &&type_count< T >::value==1 &&!is_wrapper< T >::value &&!is_direct_constructible< T, double >::value &&is_direct_constructible< T, int >::value >::type >{static constexpr object_category value{object_category::integer_constructible};};template< typename T >struct classify_object< T, typename std::enable_if< uncommon_type< T >::value &&type_count< T >::value==1 &&!is_wrapper< T >::value &&is_direct_constructible< T, double >::value &&!is_direct_constructible< T, int >::value >::type >{static constexpr object_category value{object_category::double_constructible};};template< typename T >struct classify_object< T, typename std::enable_if< is_tuple_like< T >::value &&((type_count< T >::value >=2 &&!is_wrapper< T >::value)||(uncommon_type< T >::value &&!is_direct_constructible< T, double >::value &&!is_direct_constructible< T, int >::value)||(uncommon_type< T >::value &&type_count< T >::value >=2))>::type >{static constexpr object_category value{object_category::tuple_value};};template< typename T > struct classify_object< T, typename std::enable_if< is_mutable_container< T >::value >::type >{static constexpr object_category value{object_category::container_value};};template< typename T, enable_if_t< classify_object< T >::value==object_category::char_value, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"CHAR";}template< typename T, enable_if_t< classify_object< T >::value==object_category::integral_value||classify_object< T >::value==object_category::integer_constructible, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"INT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::unsigned_integral, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"UINT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::floating_point||classify_object< T >::value==object_category::number_constructible||classify_object< T >::value==object_category::double_constructible, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"FLOAT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::enumeration, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"ENUM";}template< typename T, enable_if_t< classify_object< T >::value==object_category::boolean_value, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"BOOLEAN";}template< typename T, enable_if_t< classify_object< T >::value==object_category::complex_number, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"COMPLEX";}template< typename T, enable_if_t< classify_object< T >::value >=object_category::string_assignable &&classify_object< T >::value<=object_category::other, detail::enabler >=detail::dummy >constexpr const char *type_name(){return"TEXT";}template< typename T, enable_if_t< classify_object< T >::value==object_category::tuple_value &&type_count_base< T >::value >=2, detail::enabler >=detail::dummy >std::string type_name();template< typename T, enable_if_t< classify_object< T >::value==object_category::container_value||classify_object< T >::value==object_category::wrapper_value, detail::enabler >=detail::dummy >std::string type_name();template< typename T, enable_if_t< classify_object< T >::value==object_category::tuple_value &&type_count_base< T >::value==1, detail::enabler >=detail::dummy >inline std::string type_name(){return type_name< typename std::decay< typename std::tuple_element< 0, T >::type >::type >);}template< typename T, std::size_t I >inline typename std::enable_if< I==type_count_base< T >::value, std::string >::type tuple_name(){return std::string{};}template< typename T, std::size_t I >inline typename std::enable_if<(I< type_count_base< T >::value), std::string >::type tuple_name(){auto str=std::string{type_name< typename std::decay< typename std::tuple_element< I, T >::type >::type >)}+ ','+tuple_name< T, I+1 >);if(str.back()== ',') str.pop_back();return str;}template< typename T, enable_if_t< classify_object< T >::value==object_category::tuple_value &&type_count_base< T >::value >=2, detail::enabler > > std::string type_name()
Recursively generate the tuple type name.
Definition: CLI11.h:1729
#define UN_INDEX_CLEARER(ID)
Definition: UN_Types.h:295
#define UN_DATA_ID(Class)
Definition: UN_Types.h:218
A type denoting the size of data arrays indexed with UN_DataIndex.
Definition: UN_Types.h:123
bool operator<(const UN_DataNumber &other) const
Comparison operators.
Definition: UN_Types.h:88
static void clear(UN_DataIndex &v)
Definition: UN_Types.h:289
static void clear(UN_DataID &v)
Definition: UN_Types.h:270
GLsizeiptr size
Definition: glcorearb.h:664
bool operator<=(const UN_DataNumber &other) const
Comparison operators.
Definition: UN_Types.h:90
UN_DataNumber(ValueType value=INVALID_NUMBER)
Definition: UN_Types.h:51
static constexpr ValueType INVALID_NUMBER
Definition: UN_Types.h:46
UN_DataID(exint value)
Definition: UN_Types.h:204
bool operator==(const UN_DataNumber &other) const
Comparison operators.
Definition: UN_Types.h:84
UN_DataIndex(UN_DataSize size)
For past-end array index.
Definition: UN_Types.h:151
#define UN_DATA_INDEX(Class)
Definition: UN_Types.h:173
bool operator!=(const UN_DataNumber &other) const
Comparison operators.
Definition: UN_Types.h:86
UN_DataIndex(exint value)
Definition: UN_Types.h:157
Definition: core.h:1131
void setValue(ValueType value)
Sets the numerical value of this number.
Definition: UN_Types.h:62
UN_DataSize(exint value)
Definition: UN_Types.h:132
SYS_FORCE_INLINE bool isstring() const
UN_DataSize(ValueType value=ValueType(0))
Definition: UN_Types.h:126
UN_DataID(ValueType value=INVALID_NUMBER)
Definition: UN_Types.h:200
#define UN_ID_CLEARER(ID)
Definition: UN_Types.h:276