Branch data Line data Source code
1 : : #ifndef DAG_TYPE_HPP
2 : : #define DAG_TYPE_HPP
3 : :
4 : :
5 : :
6 : : class DagType
7 : : {
8 : :
9 : : public:
10 : :
11 : : enum FunctionalType {
12 : : BasicTopologyEntity_TYPE = 0,
13 : : SenseEntity_TYPE = 1,
14 : : GroupingEntity_TYPE = 2 };
15 : :
16 : : // Constructor
17 : : //
18 : : // Construct invalid DagType
19 : 0 : inline DagType()
20 : 0 : : intType(-1)
21 : 0 : {}
22 : :
23 : : // Constructor
24 : : //
25 : : // GroupingEntities and SenseEntities have the same
26 : : // dimension as their child BasicTopologyEntity type.
27 : : // Dimension may be outside the range [0,3], but
28 : : // if so is_valid() will return false. (i.e. it is
29 : : // possible to construct invalid DagType objects.)
30 : 1508989 : inline DagType( int dimensionIn, FunctionalType func )
31 : 1508989 : : intType( 3 * dimensionIn + func )
32 : 1508989 : { }
33 : :
34 : :
35 : : // Return the dimension of this type.
36 : : //
37 : : // GroupingEntities and SenseEntities have the same
38 : : // dimension as their child BasicTopologyEntity type.
39 : 129634 : inline int dimension() const
40 : 129634 : { return intType / 3; }
41 : :
42 : : // Return the base type of this subtype.
43 : : //
44 : : // Return values are one of GroupingEntity_TYPE,
45 : : // SenseEntity_TYPE, or BasicTopologyEntity_TYPE.
46 : 125194 : inline FunctionalType functional_type() const
47 : 125194 : { return (FunctionalType)(intType % 3); }
48 : :
49 : :
50 : : // Is this a valid DagType?
51 : : //
52 : : // An invalid type can be obtained by constructing
53 : : // a DagType object with a dimension not in the
54 : : // range [0,3], or using the operators below to
55 : : // move above a Body or below a RefVertex in the DAG.
56 : 2024450 : inline bool is_valid() const
57 : : {
58 : 2024450 : const unsigned bodyType = 11;
59 : 2024450 : return (unsigned)intType <= bodyType;
60 : : }
61 : :
62 : : // get parent of this type
63 : 389253 : inline DagType parent() const
64 : 389253 : { return DagType(intType + 1); }
65 : :
66 : :
67 : : // Comparison Operators.
68 : : //
69 : : // An entity higher in the DAG (closer to Body) is
70 : : // considered greater than an entity lower in the
71 : : // DAG (closer to RefVertex).
72 : :
73 : 4366 : inline bool operator==( DagType other ) const
74 : 4366 : { return intType == other.intType; }
75 : :
76 : 396151 : inline bool operator!=( DagType other ) const
77 : 396151 : { return intType != other.intType; }
78 : :
79 : : inline bool operator<=( DagType other ) const
80 : : { return intType <= other.intType; }
81 : :
82 : 0 : inline bool operator>=( DagType other ) const
83 : 0 : { return intType >= other.intType; }
84 : :
85 : 814030 : inline bool operator< ( DagType other ) const
86 : 814030 : { return intType < other.intType; }
87 : :
88 : 2149586 : inline bool operator> ( DagType other ) const
89 : 2149586 : { return intType > other.intType; }
90 : :
91 : :
92 : : // Addition operators.
93 : : //
94 : : // Increasing the value of the type moves the
95 : : // type up the DAG (closer to Body). No bounds
96 : : // checking is done on the value. Moving upwards
97 : : // from Body or downwards past RefVertex results
98 : : // in a DagType for which is_valid() returns false.
99 : :
100 : : inline DagType operator++()
101 : : { return DagType(++intType); }
102 : :
103 : : inline DagType operator--()
104 : : { return DagType(--intType); }
105 : :
106 : 204682 : inline DagType operator++(int)
107 : 204682 : { return DagType(intType++); }
108 : :
109 : 930118 : inline DagType operator--(int)
110 : 930118 : { return DagType(intType--); }
111 : :
112 : : inline DagType operator+=( int i )
113 : : { return DagType(intType += i); }
114 : :
115 : : inline DagType operator-=( int i )
116 : : { return DagType(intType -= i); }
117 : :
118 : : inline DagType operator+( int i ) const
119 : : { return DagType(intType + i); }
120 : :
121 : : inline DagType operator-( int i ) const
122 : : { return DagType(intType - i); }
123 : :
124 : :
125 : : // Cast to bool.
126 : : //
127 : : // Same as is_valid().
128 : : inline operator bool() const
129 : : { return is_valid(); }
130 : :
131 : :
132 : : // Get distance between types in DAG.
133 : : //
134 : : // Return value is negative if the passed type
135 : : // is higher (closer to Body) in the DAG than
136 : : // this type is. The return value is 1 (one)
137 : : // if the passed type is an immediate child of
138 : : // this type. The return value is 0 (zero) if
139 : : // the types are the same.
140 : : inline int operator-( DagType other ) const
141 : : { return intType - other.intType; }
142 : :
143 : : // Constants
144 : 308774 : inline static DagType body_type() {return DagType(3,GroupingEntity_TYPE);}
145 : 12502 : inline static DagType co_volume_type() {return DagType(3,SenseEntity_TYPE);}
146 : 62952 : inline static DagType ref_volume_type() {return DagType(3,BasicTopologyEntity_TYPE);}
147 : 46222 : inline static DagType shell_type() {return DagType(2,GroupingEntity_TYPE);}
148 : 111662 : inline static DagType co_face_type() {return DagType(2,SenseEntity_TYPE);}
149 : 427302 : inline static DagType ref_face_type() {return DagType(2,BasicTopologyEntity_TYPE);}
150 : 203840 : inline static DagType loop_type() {return DagType(1,GroupingEntity_TYPE);}
151 : 298614 : inline static DagType co_edge_type() {return DagType(1,SenseEntity_TYPE);}
152 : 650216 : inline static DagType ref_edge_type() {return DagType(1,BasicTopologyEntity_TYPE);}
153 : 522026 : inline static DagType chain_type() {return DagType(0,GroupingEntity_TYPE);}
154 : 1064644 : inline static DagType co_vertex_type() {return DagType(0,SenseEntity_TYPE);}
155 : 413716 : inline static DagType ref_vertex_type() {return DagType(0,BasicTopologyEntity_TYPE);}
156 : 0 : inline static DagType invalid_type() {return DagType(-1);}
157 : : private:
158 : :
159 : 1524053 : inline explicit DagType( int value )
160 : 1524053 : : intType( value ) {}
161 : :
162 : : int intType;
163 : : };
164 : :
165 : :
166 : : #endif
167 : :
|