Files
Attila Prokai 2e0b644c99 Initialise _null in aggregate nodes
STEPnode::_null had no default: STEPnode has no constructor, so a node built
by a subclass that does not assign it starts out with whatever was on the
heap, and is_null() then answers at random. Give STEPnode a constructor that
starts nodes null.

EntityNode::StrToVal() and ::STEPread() additionally have to set it per
outcome - they resolve an entity reference and must report null exactly when
the reference did not resolve. Before this, a node whose reference failed to
resolve could still report itself non-null.
2026-08-21 19:50:43 +02:00

156 lines
4.5 KiB
C++

#ifndef STEPAGGREGATE_H
#define STEPAGGREGATE_H
/*
* NIST STEP Core Class Library
* clstepcore/STEPaggregate.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.
*/
class InstMgrBase;
class STEPaggregate;
class TypeDescriptor;
#include <sc_export.h>
#include "clutils/errordesc.h"
#include "clstepcore/SingleLinkList.h"
#include "clstepcore/baseType.h"
#include "clstepcore/sdai.h"
#include "clstepcore/STEPundefined.h"
#include <string>
#define AGGR_NULL &NilSTEPaggregate
extern STEPaggregate NilSTEPaggregate;
class SingleLinkNode;
typedef STEPaggregate * STEPaggregateH;
typedef STEPaggregate * STEPaggregate_ptr;
typedef STEPaggregate_ptr STEPaggregate_var;
class SC_CORE_EXPORT STEPaggregate : public SingleLinkList {
protected:
bool _null;
protected:
virtual Severity ReadValue( istream & in, ErrorDescriptor * err,
const TypeDescriptor * elem_type,
InstMgrBase * insts, int addFileId = 0,
int assignVal = 1, int ExchangeFileFormat = 1,
const char * currSch = 0 );
public:
bool is_null() {
return _null;
}
virtual Severity AggrValidLevel( const char * value, ErrorDescriptor * err,
const TypeDescriptor * elem_type, InstMgrBase * insts,
int optional, char * tokenList, int addFileId = 0,
int clearError = 0 );
virtual Severity AggrValidLevel( istream & in, ErrorDescriptor * err,
const TypeDescriptor * elem_type, InstMgrBase * insts,
int optional, char * tokenList, int addFileId = 0,
int clearError = 0 );
// INPUT
virtual Severity StrToVal( const char * s, ErrorDescriptor * err = 0,
const TypeDescriptor * elem_type = 0,
InstMgrBase * insts = 0, int addFileId = 0 );
virtual Severity STEPread( istream & in, ErrorDescriptor * err,
const TypeDescriptor * elem_type = 0,
InstMgrBase * insts = 0, int addFileId = 0,
const char * currSch = 0 );
// OUTPUT
virtual const char * asStr( std::string & s ) const;
virtual void STEPwrite( ostream & out = cout, const char * = 0 ) const;
virtual SingleLinkNode * NewNode();
void AddNode( SingleLinkNode * );
void Empty();
STEPaggregate();
virtual ~STEPaggregate();
// COPY - defined in subtypes
virtual STEPaggregate & ShallowCopy( const STEPaggregate & );
};
class SC_CORE_EXPORT STEPnode : public SingleLinkNode {
protected:
int _null;
/// nodes must start out null; several StrToVal/STEPread paths leave
/// _null untouched on failure and would otherwise read uninitialised.
STEPnode() : _null( 1 ) {
}
public:
int is_null() {
return _null;
}
void set_null() {
_null = 1;
}
// INPUT
virtual Severity StrToVal( const char * s, ErrorDescriptor * err );
virtual Severity StrToVal( istream & in, ErrorDescriptor * err );
virtual Severity STEPread( const char * s, ErrorDescriptor * err );
virtual Severity STEPread( istream & in, ErrorDescriptor * err );
// OUTPUT
virtual const char * asStr( std::string & s );
virtual const char * STEPwrite( std::string & s, const char * = 0 );
virtual void STEPwrite( ostream & out = cout );
};
typedef STEPnode * STEPnodeH;
#include "clstepcore/STEPaggrGeneric.h"
#include "clstepcore/STEPaggrEntity.h"
#include "clstepcore/STEPaggrSelect.h"
#include "clstepcore/STEPaggrString.h"
#include "clstepcore/STEPaggrBinary.h"
#include "clstepcore/STEPaggrEnum.h"
#include "clstepcore/STEPaggrReal.h"
#include "clstepcore/STEPaggrInt.h"
/******************************************************************
** FIXME The following classes are currently stubs
**
**/
/*
class Array : public STEPaggregate {
public:
int lowerBound;
int upperBound;
};
class Bag : public STEPaggregate {
public:
int min_ele;
int max_ele;
};
class List : public STEPaggregate {
int min_ele;
int max_ele;
List *prev;
};
class Set :
public STEPaggregate {
int cnt;
};
*/
#endif