Back to home page

EIC code displayed by LXR

 
 

    


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     // UID
0102     // 000  ___
0103     // 001  __D
0104     // 010  _I_
0105     // 011  _ID
0106     // 100  U__
0107     // 101  U_D
0108     // 110  UI_
0109     // 111  UID
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