1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143
|
#ifndef COIN_SOBASE_H
#define COIN_SOBASE_H
/**************************************************************************\
*
* This file is part of the Coin 3D visualization library.
* Copyright (C) 1998-2004 by Systems in Motion. All rights reserved.
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* ("GPL") version 2 as published by the Free Software Foundation.
* See the file LICENSE.GPL at the root directory of this source
* distribution for additional information about the GNU GPL.
*
* For using Coin with software that can not be combined with the GNU
* GPL, and for taking advantage of the additional benefits of our
* support services, please contact Systems in Motion about acquiring
* a Coin Professional Edition License.
*
* See <URL:http://www.coin3d.org/> for more information.
*
* Systems in Motion, Teknobyen, Abels Gate 5, 7030 Trondheim, NORWAY.
* <URL:http://www.sim.no/>.
*
\**************************************************************************/
#include <Inventor/SoType.h>
#include <Inventor/lists/SoAuditorList.h>
#include <Inventor/C/base/rbptree.h>
class SbString;
class SoBaseList;
class SoInput;
class SoOutput;
class COIN_DLL_API SoBase {
public:
static void initClass(void);
void ref(void) const;
void unref(void) const;
void unrefNoDelete(void) const;
int32_t getRefCount(void) const;
void touch(void);
virtual SoType getTypeId(void) const = 0;
SbBool isOfType(SoType type) const;
static SoType getClassTypeId(void);
virtual SbName getName(void) const;
virtual void setName(const SbName & newname);
static void addName(SoBase * const base, const char * const name);
static void removeName(SoBase * const base, const char * const name);
virtual void startNotify(void);
virtual void notify(SoNotList * l);
void addAuditor(void * const auditor, const SoNotRec::Type type);
void removeAuditor(void * const auditor, const SoNotRec::Type type);
const SoAuditorList & getAuditors(void) const;
virtual void addWriteReference(SoOutput * out, SbBool isfromfield = FALSE);
SbBool shouldWrite(void);
static void incrementCurrentWriteCounter(void);
static void decrementCurrentWriteCounter(void);
static SoBase * getNamedBase(const SbName & name, SoType type);
static int getNamedBases(const SbName & name, SoBaseList & baselist,
SoType type);
static SbBool read(SoInput * in, SoBase *& base, SoType expectedtype);
static void setInstancePrefix(const SbString & c);
static void setTraceRefs(SbBool trace);
static SbBool getTraceRefs(void);
static SbBool connectRoute(SoInput * in,
const SbName & fromnodename, const SbName & fromfieldname,
const SbName & tonodename, const SbName & tofieldname);
void assertAlive(void) const;
static SbBool readRoute(SoInput * in);
protected:
// Note: these are bitflags.
enum BaseFlags { IS_ENGINE = 0x01, IS_GROUP = 0x02 };
SoBase(void);
virtual ~SoBase();
virtual void destroy(void);
SbBool hasMultipleWriteRefs(void) const;
SbBool writeHeader(SoOutput * out, SbBool isgroup, SbBool isengine) const;
void writeFooter(SoOutput * out) const;
virtual const char * getFileFormatName(void) const;
virtual SbBool readInstance(SoInput * in, unsigned short flags) = 0;
static uint32_t getCurrentWriteCounter(void);
static void staticDataLock(void);
static void staticDataUnlock(void);
private:
static SbBool readReference(SoInput * in, SoBase *& base);
static SbBool readBase(SoInput * in, SbName & classname, SoBase *& base);
static SbBool readBaseInstance(SoInput * in, const SbName & classname,
const SbName & refname, SoBase *& base);
static SoBase * createInstance(SoInput * in, const SbName & classname);
static void flushInput(SoInput * in);
static void cleanClass(void);
static void freeLists(unsigned long, void * value);
static SoType classTypeId;
struct {
int32_t referencecount : 27;
unsigned int ingraph : 1;
unsigned int alive : 4;
// The number of bits should sum up to 32, so we don't allocate
// more than one machine word on a 32-bit platform.
} objdata;
void doNotify(SoNotList * l, const void * auditor, const SoNotRec::Type type);
static void rbptree_notify_cb(void * auditor, void * type, void * closure);
cc_rbptree auditortree;
static SbDict * name2obj;
static SbDict * obj2name;
static SbString * refwriteprefix;
static SbBool tracerefs;
static uint32_t writecounter;
};
#endif // !COIN_SOBASE_H
|