Files
Clifford Yapp 6705c0f62b Implemented API v2 table-driven initialization and opt-in late-bound mode
- API v2 table-driven schema, entity, type, attribute, and inheritance
  initialization via include/clstepcore/ schemaInit.h.

- --late-bound/-T, producing descriptor-backed entities without
  generated early-bound entity classes.

- CMake controls:
    - SC_EXP2CXX_API_VERSION=2
    - SC_EXP2CXX_LATE_BOUND=ON

- Runtime late-bound construction and owned attribute storage in
  src/clstepcore/entityDescriptor.cc and src/clstepcore/STEPattribute.cc.

- Documentation and regression coverage, including incompatible option
  handling.

AP242e4 generated-output results:

 Mode                      Lines       Bytes
━━━━━━━━━━━━━━━━━━━━  ━━━━━━━━━━━  ━━━━━━━━━━
 Default v1            1,210,640    57.57 MB
────────────────────  ───────────  ──────────
 API v2 early-bound      509,001    25.20 MB
────────────────────  ───────────  ──────────
 API v2 late-bound       254,123    13.94 MB

The late-bound AP242 library compiled under C++11 and successfully
processed the BRL-CAD NIST sample: 10,609 instances
created and validated, with zero errors and warnings.
2026-08-02 06:15:25 -04:00

272 lines
9.8 KiB
C++

#ifndef STEPATTRIBUTE_H
#define STEPATTRIBUTE_H 1
/*
* NIST STEP Core Class Library
* clstepcore/STEPattribute.h
* April 1997
* K. C. Morris
* David Sauder
* Development of this software was funded by the United States Government,
* and is not subject to copyright.
*/
#include <sc_export.h>
#include <stdio.h>
#include "clutils/errordesc.h"
#include "clstepcore/baseType.h"
#include "clstepcore/sdai.h"
/** \def REAL_NUM_PRECISION
* this is used to set a const int Real_Num_Precision
* in STEPaggregate.cc and STEPattribute.cc
*/
#define REAL_NUM_PRECISION 15
class InstMgrBase;
class SDAI_Application_instance;
class STEPaggregate;
class SCLundefined;
class TypeDescriptor;
class AttrDescriptor;
class EntityDescriptor;
#include <sstream>
extern SC_CORE_EXPORT int SetErrOnNull( const char * attrValue, ErrorDescriptor * error );
extern SC_CORE_EXPORT SDAI_Application_instance * ReadEntityRef( istream & in, ErrorDescriptor * err, const char * tokenList,
InstMgrBase * instances, int addFileId );
extern SC_CORE_EXPORT SDAI_Application_instance * ReadEntityRef( const char * s, ErrorDescriptor * err, const char * tokenList,
InstMgrBase * instances, int addFileId );
extern SC_CORE_EXPORT Severity EntityValidLevel( SDAI_Application_instance * se,
const TypeDescriptor * ed, ///< entity type that entity se needs to match. (this must be an EntityDescriptor)
ErrorDescriptor * err );
extern SC_CORE_EXPORT Severity EntityValidLevel( const char * attrValue, ///< string containing entity ref
const TypeDescriptor * ed, /**< entity type that entity in attrValue (if it exists) needs
* to match. (this must be an EntityDescriptor)
*/
ErrorDescriptor * err, InstMgrBase * im, int clearError );
////////////////////
////////////////////
extern SC_CORE_EXPORT SDAI_Application_instance * STEPread_reference( const char * s, ErrorDescriptor * err,
InstMgrBase * instances, int addFileId );
////////////////////
extern SC_CORE_EXPORT int QuoteInString( istream & in );
extern SC_CORE_EXPORT void AppendChar( char c, int & index, char *& s, int & sSize );
extern SC_CORE_EXPORT void PushPastString( istream & in, std::string & s, ErrorDescriptor * err );
extern SC_CORE_EXPORT void PushPastImbedAggr( istream & in, std::string & s, ErrorDescriptor * err );
extern SC_CORE_EXPORT void PushPastAggr1Dim( istream & in, std::string & s, ErrorDescriptor * err );
class SC_CORE_EXPORT STEPattribute {
friend ostream & operator<< ( ostream &, STEPattribute & );
friend class SDAI_Application_instance;
public:
/** \union ptr
** You know which of these to use based on the return value of
** NonRefType() - see below. BASE_TYPE is defined in baseType.h
** This variable points to an appropriate member variable in the entity
** class in the generated schema class library (the entity class is
** inherited from SDAI_Application_instance)
*/
union attrUnion {
SDAI_String * S; // STRING_TYPE
SDAI_Integer * i; // INTEGER_TYPE (Integer is a long int)
SDAI_Binary * b; // BINARY_TYPE
SDAI_Real * r; // REAL_TYPE and NUMBER_TYPE (Real is a double)
SDAI_Application_instance * * c; // ENTITY_TYPE
STEPaggregate * a; // AGGREGATE_TYPE
SDAI_Enum * e; // ENUM_TYPE, BOOLEAN_TYPE, and LOGICAL_TYPE
SDAI_Select * sh; // SELECT_TYPE
SCLundefined * u; // UNKNOWN_TYPE
void * p;
} ptr;
protected:
bool _derive;
bool _mustDeletePtr; ///if a member uses new to create an object in ptr
ErrorDescriptor _error;
STEPattribute * _redefAttr;
public:
const AttrDescriptor * aDesc;
protected:
int refCount;
char SkipBadAttr( istream & in, char * StopChars );
void AddErrorInfo();
void STEPwriteError( ostream& out, unsigned int line, const char* desc );
void DeleteOwnedPtr();
public:
void incrRefCount() {
++ refCount;
}
void decrRefCount() {
-- refCount;
}
int getRefCount() {
return refCount;
}
const AttrDescriptor * getADesc() {
return aDesc;
}
void Derive( bool n = true ) {
_derive = n;
}
void RedefiningAttr( STEPattribute * a ) {
_redefAttr = a;
}
///////////// Read, Write, Assign attr value
Severity StrToVal( const char * s, InstMgrBase * instances = 0,
int addFileId = 0 );
Severity STEPread( istream & in = cin, InstMgrBase * instances = 0,
int addFileId = 0, const char * currSch = NULL, bool strict = true );
/// return the attr value as a string
string asStr( const char * currSch = 0 ) const;
const char * asStr( std::string &, const char * = 0 ) const;
/// put the attr value in ostream
void STEPwrite( ostream & out = cout, const char * currSch = 0 );
void ShallowCopy( const STEPattribute * sa );
Severity set_null();
/**
* These functions verify that the attribute contains the requested type and
* returns a pointer. The pointer is null if the requested type does not match.
*
* \sa Raw()
* \sa NonRefType()
* \sa is_null()
*/
///@{
SDAI_Integer * Integer();
SDAI_Real * Real();
SDAI_Real * Number();
SDAI_String * String();
SDAI_Binary * Binary();
SDAI_Application_instance * Entity();
STEPaggregate * Aggregate();
SDAI_Enum * Enum();
SDAI_LOGICAL * Logical();
SDAI_BOOLEAN * Boolean();
SDAI_Select * Select();
SCLundefined * Undefined();
///@}
/**
* These functions allow setting the attribute value.
* Attr type is verified using an assertion.
*
* TODO should they check that the pointer was null?
* what about ptr.c, which is ( SDAI_Application_instance ** ) ?
*/
///@{
void Integer( SDAI_Integer * n );
void Real( SDAI_Real * n );
void Number( SDAI_Real * n );
void String( SDAI_String * str );
void Binary( SDAI_Binary * bin );
void Entity( SDAI_Application_instance * ent );
void Aggregate( STEPaggregate * aggr );
void Enum( SDAI_Enum * enu );
void Logical( SDAI_LOGICAL * log );
void Boolean( SDAI_BOOLEAN * boo );
void Select( SDAI_Select * sel );
void Undefined( SCLundefined * undef );
///@}
////////////// Return info on attr
bool Nullable() const; ///< may this attribute be null?
bool is_null() const; ///< is this attribute null?
bool IsDerived() const {
return _derive;
}
STEPattribute * RedefiningAttr() {
return _redefAttr;
}
const char * Name() const;
std::string TypeName() const;
BASE_TYPE Type() const;
BASE_TYPE NonRefType() const;
BASE_TYPE BaseType() const;
const TypeDescriptor * ReferentType() const;
ErrorDescriptor & Error() {
return _error;
}
void ClearErrorMsg() {
_error.ClearErrorMsg();
}
Severity ValidLevel( const char* attrValue, ErrorDescriptor* error, InstMgrBase * im, bool clearError = true );
////////////////// Constructors
STEPattribute( const STEPattribute & a );
STEPattribute(): _derive( false ), _mustDeletePtr( false ),
_redefAttr( 0 ), aDesc( 0 ), refCount( 0 ) {
memset( & ptr, 0, sizeof( ptr ) );
}
~STEPattribute();
/** Construct storage owned by this attribute from its descriptor.
*
* Generated early-bound classes normally pass a pointer to one of
* their data members to the typed constructors below. Late-bound
* instances have no generated data members, so this constructor
* allocates the corresponding value object instead.
*/
explicit STEPattribute( const class AttrDescriptor & d );
// INTEGER
STEPattribute( const class AttrDescriptor & d, SDAI_Integer * p );
// BINARY
STEPattribute( const class AttrDescriptor & d, SDAI_Binary * p );
// STRING
STEPattribute( const class AttrDescriptor & d, SDAI_String * p );
// REAL & NUMBER
STEPattribute( const class AttrDescriptor & d, SDAI_Real * p );
// ENTITY
STEPattribute( const class AttrDescriptor & d, SDAI_Application_instance* *p );
// AGGREGATE
STEPattribute( const class AttrDescriptor & d, STEPaggregate * p );
// ENUMERATION and Logical
STEPattribute( const class AttrDescriptor & d, SDAI_Enum * p );
// SELECT
STEPattribute( const class AttrDescriptor & d, SDAI_Select * p );
// UNDEFINED
STEPattribute( const class AttrDescriptor & d, SCLundefined * p );
/// return true if attr types and values match
SC_CORE_EXPORT friend bool operator == ( const STEPattribute & a1, const STEPattribute & a2 );
SC_CORE_EXPORT friend bool operator != ( const STEPattribute & a1, const STEPattribute & a2 );
/// return true if aDesc's match (behavior of old operator==)
SC_CORE_EXPORT friend bool sameADesc ( const STEPattribute & a1, const STEPattribute & a2 );
};
#endif