HDK
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
PDGT_BaseType.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  * COMMENTS:
7  */
8 
9 #ifndef __PDGT_BASE_TYPE_H__
10 #define __PDGT_BASE_TYPE_H__
11 
12 #include "PDGT_API.h"
13 
14 #include <SYS/SYS_AtomicInt.h>
15 
16 #include <UT/UT_NonCopyable.h>
17 #include <UT/UT_Set.h>
18 #include <UT/UT_StringHolder.h>
19 
20 /**
21  * Base class for types in a PDGT-based type system. This class provides
22  * functionality that is common to all types, without needing to know about
23  * the specifics of the type or the construction arguments.
24  *
25  * It knows:
26  * The name and human-readable label for the type
27  * The language the type is defined in (C++ or Python)
28  * The number of instances that exist
29  * The set of compatible types, e.g. things that this type can be thought
30  * of a "deriving" from.
31  *
32  * Internally, it also knows the enum entry associated with the type. The
33  * type registration system has an enumeration of types associated with it -
34  * this is the EnumType template argument. This type corresponds to a distinct
35  * entry in that enumeration.
36  *
37  */
38 template <typename EnumType>
40 {
41 public:
42  enum Language
43  {
45  eCpp
46  };
47 
49 
50 public:
52  const UT_StringHolder& type_label,
53  Language lang,
54  EnumType reg_type)
55  : myTypeName(type_name)
56  , myTypeLabel(type_label)
57  , myLanguage(lang)
58  , myInstanceCount(0)
59  , myType(reg_type)
60  {
61  }
62 
63  virtual ~PDGT_BaseType() {}
64 
65  const UT_StringHolder& typeName() const
66  { return myTypeName; }
68  { myTypeName = name; }
69 
70  const UT_StringHolder& typeLabel() const
71  { return myTypeLabel; }
73  { myTypeLabel = label; }
74 
76  { return myLanguage; }
77  EnumType type() const
78  { return myType; }
79 
80 
81  int instanceCount() const
82  { return myInstanceCount.relaxedLoad(); }
83  void instanceCreated() const
84  { myInstanceCount.add(1); }
85  void instanceDestroyed() const
86  { myInstanceCount.add(-1); }
87 
89  bool deep=true) const
90  {
91  if (type == nullptr)
92  return true;
93 
94  return (type == this) ||
95  (deep && myParentTypes.count(type) > 0);
96  }
97 
99  bool recurse=true)
100  {
101  myParentTypes.insert(type);
102  if (!recurse)
103  return;
104 
105  for (auto type_parent : type->myParentTypes)
106  myParentTypes.insert(type_parent);
107  }
108 
109  virtual bool initialize(UT_WorkBuffer& errors) = 0;
110  virtual int64 instanceMemoryUsage() const
111  { return 0; }
112 
113  virtual UT_StringHolder displayName() const
114  {
115  UT_StringHolder display_name;
116  display_name.format("{} ({})",
117  myTypeLabel, myTypeName);
118  return display_name;
119  }
120 
121 protected:
127  EnumType myType;
128 };
129 
130 #endif
131 
GLuint GLsizei const GLchar * label
Definition: glcorearb.h:2545
Language myLanguage
virtual ~PDGT_BaseType()
Definition: PDGT_BaseType.h:63
void addParent(const PDGT_BaseType *type, bool recurse=true)
Definition: PDGT_BaseType.h:98
const UT_StringHolder & typeName() const
Definition: PDGT_BaseType.h:65
const UT_StringHolder & typeLabel() const
Definition: PDGT_BaseType.h:70
void setTypeName(const UT_StringHolder &name)
Definition: PDGT_BaseType.h:67
virtual UT_StringHolder displayName() const
virtual int64 instanceMemoryUsage() const
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
UT_StringHolder myTypeName
#define PDGT_API_TMPL
Definition: PDGT_API.h:24
int instanceCount() const
Definition: PDGT_BaseType.h:81
long long int64
Definition: SYS_Types.h:116
GLuint const GLchar * name
Definition: glcorearb.h:786
OPENVDB_API void initialize()
Global registration of native Grid, Transform, Metadata and Point attribute types. Also initializes blosc (if enabled).
Definition: logging.h:294
size_t format(const char *fmt, const Args &...args)
Format a string using the same formatting codes as UTformat.
Language language() const
Definition: PDGT_BaseType.h:75
EnumType myType
PDGT_BaseType(const UT_StringHolder &type_name, const UT_StringHolder &type_label, Language lang, EnumType reg_type)
Definition: PDGT_BaseType.h:51
bool compareType(const PDGT_BaseType *type, bool deep=true) const
Definition: PDGT_BaseType.h:88
UT_StringHolder myTypeLabel
void instanceDestroyed() const
Definition: PDGT_BaseType.h:85
SYS_AtomicInt32 myInstanceCount
EnumType type() const
Definition: PDGT_BaseType.h:77
type
Definition: core.h:1059
TypeSet myParentTypes
void setTypeLabel(const UT_StringHolder &label)
Definition: PDGT_BaseType.h:72
void instanceCreated() const
Definition: PDGT_BaseType.h:83