File indexing completed on 2026-04-09 07:49:14
0001
0002 #include <cstring>
0003 #include <csignal>
0004 #include <iostream>
0005 #include <sstream>
0006 #include <iomanip>
0007
0008 #include "ssys.h"
0009 #include "OpticksCSG.h"
0010
0011
0012 struct OpticksCSGTest
0013 {
0014 static int Main();
0015
0016 static int TypeCodeVec();
0017 static int Type();
0018 static int TypeMask();
0019
0020 static int HintCode(const char* name);
0021 static int HintCode();
0022 static int OffsetType();
0023 static int MaskString();
0024
0025 static constexpr const char* HINTCODE_NAMES = R"LITERAL(
0026 Hello_CSG_CONTIGUOUS
0027 Hello_CSG_DISCONTIGUOUS
0028 Hello_CSG_OVERLAP
0029 Name_without_any_hint
0030 )LITERAL";
0031
0032 };
0033
0034
0035 int OpticksCSGTest::Main()
0036 {
0037 const char* TEST = ssys::getenvvar("TEST", "ALL");
0038 bool ALL = strcmp(TEST,"ALL") == 0 ;
0039 int rc = 0 ;
0040 if(ALL||0==strcmp(TEST,"TypeCodeVec")) rc += TypeCodeVec();
0041 if(ALL||0==strcmp(TEST,"Type")) rc += Type();
0042 if(ALL||0==strcmp(TEST,"TypeMask")) rc += TypeMask();
0043 if(ALL||0==strcmp(TEST,"HintCode")) rc += HintCode();
0044 if(ALL||0==strcmp(TEST,"OffsetType")) rc += OffsetType();
0045 if(ALL||0==strcmp(TEST,"MaskString")) rc += MaskString();
0046
0047 return rc ;
0048 }
0049
0050
0051 int OpticksCSGTest::TypeCodeVec()
0052 {
0053 const char* names = "torus,notsupported,cutcylinder,phicut,halfspace" ;
0054 std::vector<int> typecode ;
0055 CSG::TypeCodeVec(typecode, names, ',');
0056
0057 size_t sz = typecode.size() ;
0058
0059 assert( sz == 5 );
0060 std::cout
0061 << "OpticksCSGTest::TypeCodeVec"
0062 << " names [" << names << "]"
0063 << " sz " << sz
0064 << "\n"
0065 ;
0066
0067 for(size_t i=0 ; i < sz ; i++ ) std::cout
0068 << " i " << std::setw(4) << i
0069 << " tc " << std::setw(4) << typecode[i]
0070 << " CSG::Name(tc) " << CSG::Name(typecode[i])
0071 << "\n"
0072 ;
0073
0074 return 0;
0075 }
0076
0077
0078
0079 int OpticksCSGTest::Type()
0080 {
0081 for(unsigned i=0 ; i < 100 ; i++)
0082 {
0083 OpticksCSG_t type = (OpticksCSG_t)i ;
0084 if(!CSG::Exists(type)) continue ;
0085
0086 const char* name = CSG::Name( type );
0087
0088 std::cout
0089 << " type " << std::setw(3) << type
0090 << " name " << std::setw(20) << name
0091 << std::endl ;
0092
0093
0094 }
0095 return 0 ;
0096 }
0097
0098 int OpticksCSGTest::TypeMask()
0099 {
0100
0101
0102
0103
0104
0105
0106
0107
0108
0109
0110
0111 std::vector<unsigned> masks = {{
0112 0u,
0113 CSG::Mask(CSG_DIFFERENCE),
0114 CSG::Mask(CSG_INTERSECTION),
0115 CSG::Mask(CSG_INTERSECTION) | CSG::Mask(CSG_DIFFERENCE),
0116 CSG::Mask(CSG_UNION),
0117 CSG::Mask(CSG_UNION) | CSG::Mask(CSG_DIFFERENCE),
0118 CSG::Mask(CSG_UNION) | CSG::Mask(CSG_INTERSECTION),
0119 CSG::Mask(CSG_UNION) | CSG::Mask(CSG_INTERSECTION) | CSG::Mask(CSG_DIFFERENCE)
0120 }};
0121
0122 for(unsigned i=0 ; i < masks.size() ; i++)
0123 {
0124 unsigned mask = masks[i] ;
0125 std::cout
0126 << " i " << std::setw(5) << i
0127 << " mask " << std::setw(5) << mask
0128 << " CSG::TypeMask(mask) " << std::setw(10) << CSG::TypeMask(mask)
0129 << " CSG::IsPositiveMask(mask) " << std::setw(2) << CSG::IsPositiveMask(mask)
0130 << std::endl
0131 ;
0132 }
0133 return 0 ;
0134 }
0135
0136
0137 int OpticksCSGTest::HintCode(const char* name)
0138 {
0139 unsigned hintcode = CSG::HintCode(name);
0140 std::cout
0141 << " name " << std::setw(40) << name
0142 << " hintcode " << std::setw(6) << hintcode
0143 << " CSG::Name(hintcode) " << std::setw(15) << CSG::Name(hintcode)
0144 << std::endl
0145 ;
0146 return 0 ;
0147 }
0148
0149 int OpticksCSGTest::HintCode()
0150 {
0151 int rc = 0 ;
0152 std::stringstream ss(HINTCODE_NAMES) ;
0153 std::string name ;
0154 while (std::getline(ss, name)) if(!name.empty()) rc += HintCode(name.c_str());
0155 return rc ;
0156 }
0157
0158
0159 int OpticksCSGTest::OffsetType()
0160 {
0161 std::vector<unsigned> types = {
0162 CSG_ZERO,
0163 CSG_TREE,
0164 CSG_UNION,
0165 CSG_INTERSECTION,
0166 CSG_DIFFERENCE,
0167 CSG_LIST,
0168 CSG_CONTIGUOUS,
0169 CSG_DISCONTIGUOUS,
0170 CSG_OVERLAP,
0171 CSG_LEAF,
0172 CSG_SPHERE,
0173 CSG_BOX,
0174 CSG_ZSPHERE,
0175 CSG_TUBS,
0176 CSG_CYLINDER,
0177 CSG_SLAB,
0178 CSG_PLANE,
0179 CSG_CONE,
0180 CSG_BOX3,
0181 CSG_TRAPEZOID,
0182 CSG_CONVEXPOLYHEDRON,
0183 CSG_DISC,
0184 CSG_SEGMENT,
0185 CSG_ELLIPSOID,
0186 CSG_TORUS,
0187 CSG_HYPERBOLOID,
0188 CSG_CUBIC,
0189 CSG_INFCYLINDER,
0190 CSG_PHICUT,
0191 CSG_THETACUT,
0192 CSG_UNDEFINED
0193 };
0194
0195 for(unsigned i=0 ; i < types.size() ; i++)
0196 {
0197 OpticksCSG_t type = (OpticksCSG_t)types[i];
0198 const char* name = CSG::Name(type) ;
0199 int type2 = CSG::TypeCode(name);
0200 const char* name2 = CSG::Name(type2) ;
0201
0202 unsigned offset_type = CSG::OffsetType(type);
0203 unsigned type3 = CSG::TypeFromOffsetType( offset_type );
0204
0205 std::cout
0206 << " i " << std::setw(3) << i
0207 << " type " << std::setw(3) << type
0208 << " offset_type " << std::setw(3) << offset_type
0209 << " CSG::Tag(type) " << std::setw(10) << CSG::Tag(type)
0210 << " CSG::Name(type) " << std::setw(15) << name
0211 << " CSG::Name(type2) " << std::setw(15) << name2
0212 << " CSG::IsPrimitive(type) " << std::setw(2) << CSG::IsPrimitive(type)
0213 << " CSG::IsList(type) " << std::setw(2) << CSG::IsList(type)
0214 << " CSG::IsCompound(type) " << std::setw(2) << CSG::IsCompound(type)
0215 << " CSG::IsLeaf(type) " << std::setw(2) << CSG::IsLeaf(type)
0216 << std::endl
0217 ;
0218
0219 bool type2_expect = type2 == type ;
0220 bool type3_expect = type3 == type ;
0221
0222 assert( type2_expect );
0223 assert( type3_expect );
0224
0225 if(!type2_expect) std::raise(SIGINT);
0226 if(!type3_expect) std::raise(SIGINT);
0227 }
0228 return 0 ;
0229 }
0230
0231 int OpticksCSGTest::MaskString()
0232 {
0233 unsigned mask = CSG::Mask(CSG_SPHERE) | CSG::Mask(CSG_UNION) ;
0234 std::cout << CSG::MaskString(mask) << std::endl ;
0235
0236 unsigned typemask = 0 ;
0237
0238 for(unsigned i=0 ; i < 32 ; i++)
0239 {
0240 OpticksCSG_t type = (OpticksCSG_t)CSG::TypeFromOffsetType(i) ;
0241 typemask |= CSG::Mask(type);
0242
0243 const char* name = CSG::Name(type) ;
0244 if( name == nullptr ) continue ;
0245
0246 std::cout
0247 << " i " << std::setw(3) << i
0248 << " type " << std::setw(3) << type
0249 << " CSG::Name(type) " << std::setw(20) << CSG::Name(type)
0250 << " typemask " << std::setw(10) << typemask
0251 << " CSG::MaskString(typemask) " << CSG::MaskString(typemask)
0252 << std::endl
0253 ;
0254
0255 }
0256 return 0 ;
0257 }
0258
0259 int main(){ return OpticksCSGTest::Main(); }
0260