From f6dff37fc15d8f13ae4c88cd313551f284180cae Mon Sep 17 00:00:00 2001 From: Jeff Hill Date: Mon, 10 May 1999 23:42:25 +0000 Subject: [PATCH] fixed many const releated problems --- src/gdd/gdd.cc | 17 +++++---- src/gdd/gdd.h | 39 +++++++++++++++------ src/gdd/gddContainer.cc | 17 ++++++--- src/gdd/gddContainer.h | 61 +++++++++++++++++++++++--------- src/gdd/gddContainerI.h | 78 +++++++++++++++++++++++++++++++---------- src/gdd/gddI.h | 45 +++++++++++++++++------- src/gdd/gddTest.cc | 5 ++- 7 files changed, 190 insertions(+), 72 deletions(-) diff --git a/src/gdd/gdd.cc b/src/gdd/gdd.cc index 0a2b2a94d..ecb66023a 100644 --- a/src/gdd/gdd.cc +++ b/src/gdd/gdd.cc @@ -4,6 +4,9 @@ // $Id$ // // $Log$ +// Revision 1.28 1999/05/03 17:33:02 jhill +// derive from gddDestructor so that same form of new and delete are used +// // Revision 1.27 1999/04/30 15:24:53 jhill // fixed improper container index bug // @@ -523,13 +526,13 @@ gddStatus gdd::copyStuff(gdd* dd,int ctype) size_t gdd::getDataSizeBytes(void) const { size_t sz=0; - gdd* pdd; + const gdd* pdd; aitString* str; if(isContainer()) { const gddContainer* cdd=(const gddContainer*)this; - gddCursor cur=cdd->getCursor(); + constGddCursor cur=cdd->getCursor(); for(pdd=cur.first();pdd;pdd=cur.next()) sz+=pdd->getTotalSizeBytes(); } @@ -567,7 +570,7 @@ size_t gdd::getTotalSizeBytes(void) const { size_t sz; unsigned long tsize; - gdd* pdd; + const gdd* pdd; // add up size of bounds + size of this DD sz=sizeof(gdd)+(sizeof(gddBounds)*dimension()); @@ -602,7 +605,7 @@ size_t gdd::getTotalSizeBytes(void) const else if(isContainer()) { const gddContainer* cdd=(const gddContainer*)this; - gddCursor cur=cdd->getCursor(); + constGddCursor cur=cdd->getCursor(); for(pdd=cur.first();pdd;pdd=cur.next()) sz+=pdd->getTotalSizeBytes(); } @@ -1354,7 +1357,7 @@ gddStatus gdd::put(const gdd* dd) return rc; } -size_t gdd::outHeader(void* buf,aitUint32 bufsize) +size_t gdd::outHeader(void* buf,aitUint32 bufsize) const { // simple encoding for now.. will change later // this is the SLOW, simple version @@ -1413,7 +1416,7 @@ size_t gdd::outHeader(void* buf,aitUint32 bufsize) } return sz; } -size_t gdd::outData(void* buf,aitUint32 bufsize, aitEnum e, aitDataFormat f) +size_t gdd::outData(void* buf,aitUint32 bufsize, aitEnum e, aitDataFormat f) const { // put data into user's buffer in the format that the user wants (e/f). // if e is invalid, then use whatever format this gdd describes. @@ -1434,7 +1437,7 @@ size_t gdd::outData(void* buf,aitUint32 bufsize, aitEnum e, aitDataFormat f) return len; } -size_t gdd::out(void* buf,aitUint32 bufsize,aitDataFormat f) +size_t gdd::out(void* buf,aitUint32 bufsize,aitDataFormat f) const { size_t index = outHeader(buf,bufsize); size_t rc; diff --git a/src/gdd/gdd.h b/src/gdd/gdd.h index 02d0f3400..84c161293 100644 --- a/src/gdd/gdd.h +++ b/src/gdd/gdd.h @@ -8,6 +8,9 @@ * $Id$ * * $Log$ + * Revision 1.26 1999/04/30 15:24:53 jhill + * fixed improper container index bug + * * Revision 1.25 1998/05/05 21:09:52 jhill * removed backslash which conuses cpp * @@ -112,7 +115,6 @@ # include #elif defined(vxWorks) # include -# include // for timespec under v51 vxWorks #elif defined(UNIX) // hopefully a posix compliant OS # include @@ -133,6 +135,10 @@ class gddContainer; class gddArray; class gddScalar; +struct TS_STAMP; +class osiTime; +struct timespec; + // Not Complete in this prototype: // - Read only DD. // - Small array management using free lists @@ -199,8 +205,9 @@ public: const aitType& getData(void) const; aitType* dataUnion(void); const aitType* dataUnion(void) const; - gddDestructor* destructor(void) const; + const gddDestructor* destructor(void) const; gdd* next(void); + const gdd* next(void) const; void setNext(gdd*); const gddBounds* getBounds(void) const; @@ -220,19 +227,29 @@ public: gddStatus getBound(unsigned dim_to_get, aitIndex& first, aitIndex& count) const; gddStatus registerDestructor(gddDestructor*); gddStatus replaceDestructor(gddDestructor*); - void* dataVoid(void) const; - void* dataAddress(void) const; - void* dataPointer(void) const; - void* dataPointer(aitIndex element_offset) const; + const void* dataVoid(void) const; + void* dataVoid(void); + const void* dataAddress(void) const; + void* dataAddress(void); + const void* dataPointer(void) const; + void* dataPointer(void); + const void* dataPointer(aitIndex element_offset) const; + void* dataPointer(aitIndex element_offset); void getTimeStamp(struct timespec* const ts) const; void getTimeStamp(aitTimeStamp* const ts) const; + void getTimeStamp(struct TS_STAMP* const ts) const; + void getTimeStamp(osiTime* const ts) const; + void setTimeStamp(const struct timespec* const ts); void setTimeStamp(const aitTimeStamp* const ts); + void setTimeStamp(const struct TS_STAMP* const ts); + void setTimeStamp(const osiTime* const ts); + void setStatus(aitUint32); void setStatus(aitUint16 high, aitUint16 low); - void getStatus(aitUint32&); - void getStatus(aitUint16& high, aitUint16& low); + void getStatus(aitUint32&) const; + void getStatus(aitUint16& high, aitUint16& low) const; void setStat(aitUint16); void setSevr(aitUint16); @@ -523,10 +540,10 @@ public: // data in the user's buffer will be assumed to be the same as the // type defined in the gdd. - size_t out(void* buf,aitUint32 bufsize,aitDataFormat =aitNetworkDataFormat); - size_t outHeader(void* buf,aitUint32 bufsize); + size_t out(void* buf,aitUint32 bufsize,aitDataFormat =aitNetworkDataFormat) const; + size_t outHeader(void* buf,aitUint32 bufsize) const; size_t outData(void* buf,aitUint32 bufsize, - aitEnum = aitEnumInvalid, aitDataFormat = aitNetworkDataFormat); + aitEnum = aitEnumInvalid, aitDataFormat = aitNetworkDataFormat) const; size_t in(void* buf, aitDataFormat =aitNetworkDataFormat); size_t inHeader(void* buf); diff --git a/src/gdd/gddContainer.cc b/src/gdd/gddContainer.cc index 866d4f687..0efe8a711 100644 --- a/src/gdd/gddContainer.cc +++ b/src/gdd/gddContainer.cc @@ -8,6 +8,9 @@ // // $Id$ // $Log$ +// Revision 1.3 1999/04/30 15:24:53 jhill +// fixed improper container index bug +// // Revision 1.2 1997/04/23 17:13:03 jhill // fixed export of symbols from WIN32 DLL // @@ -19,10 +22,14 @@ // --------------------The gddContainer functions--------------------- -gddCursor gddContainer::getCursor(void) const +gddCursor gddContainer::getCursor(void) { - gddCursor ec(this); - return ec; + return gddCursor (this); +} + +constGddCursor gddContainer::getCursor(void) const +{ + return constGddCursor (this); } gddContainer::gddContainer(void):gdd(0,aitEnumContainer,1) { } @@ -127,10 +134,10 @@ gddStatus gddContainer::remove(aitIndex index) // ------------------------cursor functions------------------------------- -gdd* gddCursor::operator[](int index) +const gdd* constGddCursor::operator[](int index) { int i,start; - gdd* dd; + const gdd* dd; if(index>=curr_index) { diff --git a/src/gdd/gddContainer.h b/src/gdd/gddContainer.h index 9836d7f45..d6147e7dc 100644 --- a/src/gdd/gddContainer.h +++ b/src/gdd/gddContainer.h @@ -7,6 +7,9 @@ * * $Id$ * $Log$ + * Revision 1.3 1999/04/30 15:24:53 jhill + * fixed improper container index bug + * * Revision 1.2 1997/04/23 17:13:04 jhill * fixed export of symbols from WIN32 DLL * @@ -18,6 +21,7 @@ #include "shareLib.h" +class constGddCursor; class gddCursor; /* this class needs to be able to register a destructor for the container */ @@ -38,8 +42,11 @@ public: void test(void); // preferred method for looking into a container - gddCursor getCursor(void) const; - gdd* cData(void) const; + gddCursor getCursor(void); + constGddCursor getCursor(void) const; + + const gdd* cData(void) const; + gdd* cData(void); protected: gddContainer(int,int,int,int*) { } @@ -52,20 +59,47 @@ protected: gddStatus setBound(int,aitIndex,aitIndex) { gddAutoPrint("setBound()",gddErrorNotAllowed); return gddErrorNotAllowed; } - gddStatus getBound(int,aitIndex&,aitIndex&) { + gddStatus getBound(int,aitIndex&,aitIndex&) const { gddAutoPrint("getBound()",gddErrorNotAllowed); return gddErrorNotAllowed; } gddStatus setBound(aitIndex,aitIndex); private: - friend class gddCursor; + friend class constGddCursor; }; -class epicsShareClass gddCursor -{ +class epicsShareClass constGddCursor { +public: + constGddCursor(void); + constGddCursor(const gddContainer* ec); + + const gdd* first(void); + const gdd* first(const gddScalar*&); + const gdd* first(const gddAtomic*&); + const gdd* first(const gddContainer*&); + + const gdd* next(void); + const gdd* next(const gddScalar*&); + const gdd* next(const gddAtomic*&); + const gdd* next(const gddContainer*&); + + const gdd* current(void) const; + const gdd* current(const gddScalar*&) const; + const gdd* current(const gddAtomic*&) const; + const gdd* current(const gddContainer*&) const; + + const gdd* operator[](int index); + +private: + const gddContainer* list; + const gdd* curr; + int curr_index; +}; + +class epicsShareClass gddCursor : private constGddCursor { public: gddCursor(void); - gddCursor(const gddContainer* ec); + gddCursor(gddContainer* ec); gdd* first(void); gdd* first(gddScalar*&); @@ -77,17 +111,12 @@ public: gdd* next(gddAtomic*&); gdd* next(gddContainer*&); - gdd* current(void); - gdd* current(gddScalar*&); - gdd* current(gddAtomic*&); - gdd* current(gddContainer*&); + gdd* current(void) const; + gdd* current(gddScalar*&) const; + gdd* current(gddAtomic*&) const; + gdd* current(gddContainer*&) const; gdd* operator[](int index); - -private: - const gddContainer* list; - gdd* curr; - int curr_index; }; #include "gddContainerI.h" diff --git a/src/gdd/gddContainerI.h b/src/gdd/gddContainerI.h index 3aa282cd3..44c06c2a9 100644 --- a/src/gdd/gddContainerI.h +++ b/src/gdd/gddContainerI.h @@ -7,50 +7,90 @@ * * $Id$ * $Log$ + * Revision 1.2 1999/04/30 15:24:53 jhill + * fixed improper container index bug + * * Revision 1.1 1997/03/21 01:56:07 jbk * *** empty log message *** * * */ -inline gdd* gddContainer::cData(void) const +inline gdd* gddContainer::cData(void) { return (gdd*)dataPointer(); } +inline const gdd* gddContainer::cData(void) const + { return (const gdd*)dataPointer(); } + inline int gddContainer::total(void) const { return bounds->size(); } inline gddStatus gddContainer::setBound(aitIndex f, aitIndex c) { bounds->set(f,c); return 0; } -inline gddCursor::gddCursor(void):list(NULL) +inline constGddCursor::constGddCursor(void):list(NULL) { curr=NULL; } -inline gddCursor::gddCursor(const gddContainer* ec):list(ec) +inline constGddCursor::constGddCursor(const gddContainer* ec):list(ec) { curr=ec->cData(); curr_index=0; } -inline gdd* gddCursor::first(void) +inline const gdd* constGddCursor::first(void) { curr=list->cData(); curr_index=0; return curr; } +inline const gdd* constGddCursor::first(const gddScalar*& dd) + { return (const gdd*)(dd=(gddScalar*)first()); } +inline const gdd* constGddCursor::first(const gddAtomic*& dd) + { return (const gdd*)(dd=(gddAtomic*)first()); } +inline const gdd* constGddCursor::first(const gddContainer*& dd) + { return (const gdd*)(dd=(gddContainer*)first()); } + +inline const gdd* constGddCursor::next(void) + { if(curr) { curr_index++;curr=curr->next(); } return curr; } +inline const gdd* constGddCursor::next(const gddScalar*& dd) + { return (const gdd*)(dd=(gddScalar*)next()); } +inline const gdd* constGddCursor::next(const gddAtomic*& dd) + { return (const gdd*)(dd=(gddAtomic*)next()); } +inline const gdd* constGddCursor::next(const gddContainer*& dd) + { return (const gdd*)(dd=(gddContainer*)next()); } + +inline const gdd* constGddCursor::current(void) const + { return curr; } +inline const gdd* constGddCursor::current(const gddScalar*& dd) const + { return (const gdd*)(dd=(gddScalar*)current()); } +inline const gdd* constGddCursor::current(const gddAtomic*& dd) const + { return (const gdd*)(dd=(gddAtomic*)current()); } +inline const gdd* constGddCursor::current(const gddContainer*& dd) const + { return (const gdd*)(dd=(gddContainer*)current()); } + +inline gddCursor::gddCursor(void){} +inline gddCursor::gddCursor(gddContainer* ec) : + constGddCursor(ec) {} + +inline gdd* gddCursor::first(void) + { return (gdd *) constGddCursor::first(); } inline gdd* gddCursor::first(gddScalar*& dd) - { return (gdd*)(dd=(gddScalar*)first()); } + { return (gdd *) constGddCursor::first((const gddScalar*&)dd); } inline gdd* gddCursor::first(gddAtomic*& dd) - { return (gdd*)(dd=(gddAtomic*)first()); } + { return (gdd *) constGddCursor::first((const gddAtomic*&)dd); } inline gdd* gddCursor::first(gddContainer*& dd) - { return (gdd*)(dd=(gddContainer*)first()); } + { return (gdd *) constGddCursor::first((const gddContainer*&)dd); } inline gdd* gddCursor::next(void) - { if(curr) { curr_index++;curr=curr->next(); } return curr; } + { return (gdd *) constGddCursor::next(); } inline gdd* gddCursor::next(gddScalar*& dd) - { return (gdd*)(dd=(gddScalar*)next()); } + { return (gdd*)constGddCursor::next((const gddScalar*&)dd); } inline gdd* gddCursor::next(gddAtomic*& dd) - { return (gdd*)(dd=(gddAtomic*)next()); } + { return (gdd*)constGddCursor::next((const gddAtomic*&)dd); } inline gdd* gddCursor::next(gddContainer*& dd) - { return (gdd*)(dd=(gddContainer*)next()); } + { return (gdd*)constGddCursor::next((const gddContainer*&)dd); } -inline gdd* gddCursor::current(void) - { return curr; } -inline gdd* gddCursor::current(gddScalar*& dd) - { return (gdd*)(dd=(gddScalar*)current()); } -inline gdd* gddCursor::current(gddAtomic*& dd) - { return (gdd*)(dd=(gddAtomic*)current()); } -inline gdd* gddCursor::current(gddContainer*& dd) - { return (gdd*)(dd=(gddContainer*)current()); } +inline gdd* gddCursor::current(void) const + { return (gdd*)constGddCursor::current(); } +inline gdd* gddCursor::current(gddScalar*& dd) const + { return (gdd*)constGddCursor::current(); } +inline gdd* gddCursor::current(gddAtomic*& dd) const + { return (gdd*)constGddCursor::current(); } +inline gdd* gddCursor::current(gddContainer*& dd) const + { return (gdd*)constGddCursor::current(); } + +inline gdd* gddCursor::operator[](int index) +{ return (gdd *) constGddCursor::operator [](index); } #endif diff --git a/src/gdd/gddI.h b/src/gdd/gddI.h index 9d8d4c444..ff7c050c6 100644 --- a/src/gdd/gddI.h +++ b/src/gdd/gddI.h @@ -8,6 +8,9 @@ * $Id$ * * $Log$ + * Revision 1.4 1999/04/30 15:24:53 jhill + * fixed improper container index bug + * * Revision 1.3 1998/06/16 03:16:27 jhill * fixed big problems with leaked ait/fixedString in gdd union * @@ -20,7 +23,7 @@ */ inline void gdd::setData(void* d) { data.Pointer=d; } -inline gddDestructor* gdd::destructor(void) const { return destruct; } +inline const gddDestructor* gdd::destructor(void) const { return destruct; } inline gdd::gdd(void) { init(0,aitEnumInvalid,0); } inline gdd::gdd(int app) { init(app,aitEnumInvalid,0); } @@ -32,6 +35,7 @@ inline const gddBounds* gdd::getBounds(void) const { return bounds; } inline const gddBounds* gdd::getBounds(int bn) const { return &bounds[bn]; } inline gdd* gdd::next(void) { return nextgdd; } +inline const gdd* gdd::next(void) const { return nextgdd; } inline void gdd::setNext(gdd* n) { nextgdd=n; } inline unsigned gdd::dimension(void) const { return dim; } inline aitType& gdd::getData(void) { return data; } @@ -42,10 +46,18 @@ inline void gdd::setApplType(int t) { appl_type=(aitUint16)t; } inline gddStatus gdd::copyInfo(gdd* dd) { return copyStuff(dd,0); } inline gddStatus gdd::copy(gdd* dd) { return copyStuff(dd,1); } inline gddStatus gdd::Dup(gdd* dd) { return copyStuff(dd,2); } -inline void* gdd::dataAddress(void) const { return (void*)&data; } -inline void* gdd::dataPointer(void) const { return data.Pointer; } +inline const void* gdd::dataAddress(void) const { return (void*)&data; } +inline void* gdd::dataAddress(void) { return (void*)&data; } +inline const void* gdd::dataPointer(void) const { return data.Pointer; } +inline void* gdd::dataPointer(void) { return data.Pointer; } -inline void* gdd::dataVoid(void) const +inline const void* gdd::dataVoid(void) const +{ + return (dimension()||primitiveType()==aitEnumFixedString)? + dataPointer():dataAddress(); +} + +inline void* gdd::dataVoid(void) { return (dimension()||primitiveType()==aitEnumFixedString)? dataPointer():dataAddress(); @@ -57,7 +69,10 @@ inline aitUint32 gdd::align8(unsigned long count) const return (tmp!=count)?tmp+8:tmp; } -inline void* gdd::dataPointer(aitIndex f) const +inline const void* gdd::dataPointer(aitIndex f) const + { return (void*)(((aitUint8*)dataPointer())+aitSize[primitiveType()]*f); } + +inline void* gdd::dataPointer(aitIndex f) { return (void*)(((aitUint8*)dataPointer())+aitSize[primitiveType()]*f); } inline int gdd::isManaged(void) const { return flags&GDD_MANAGED_MASK; } @@ -75,19 +90,23 @@ inline void gdd::markUnmanaged(void) { flags&=~GDD_MANAGED_MASK; } inline void gdd::markLocalDataFormat(void) { flags&=~GDD_NET_MASK; } inline void gdd::markNotLocalDataFormat(void) { flags|=GDD_NET_MASK; } -inline void gdd::getTimeStamp(struct timespec* const ts) const - { ts->tv_sec=time_stamp.tv_sec; ts->tv_nsec=time_stamp.tv_nsec; } -inline void gdd::setTimeStamp(const struct timespec* const ts) { - time_stamp.tv_sec=(aitUint32)ts->tv_sec; - time_stamp.tv_nsec=(aitUint32)ts->tv_nsec; } -inline void gdd::getTimeStamp(aitTimeStamp* const ts) const { *ts=time_stamp; } +inline void gdd::getTimeStamp(struct timespec* const ts) const { time_stamp.get(*ts); } +inline void gdd::setTimeStamp(const struct timespec* const ts) { time_stamp=*ts; } + +inline void gdd::getTimeStamp(aitTimeStamp* const ts) const { *ts = time_stamp; } inline void gdd::setTimeStamp(const aitTimeStamp* const ts) { time_stamp=*ts; } +inline void gdd::getTimeStamp(struct TS_STAMP* const ts) const { time_stamp.get(*ts); } +inline void gdd::setTimeStamp(const struct TS_STAMP* const ts) { time_stamp=*ts; } + +inline void gdd::getTimeStamp(osiTime* const ts) const { time_stamp.get(*ts); } +inline void gdd::setTimeStamp(const osiTime* const ts) { time_stamp=*ts; } + inline void gdd::setStatus(aitUint32 s) { status=s; } -inline void gdd::getStatus(aitUint32& s) { s=status; } +inline void gdd::getStatus(aitUint32& s) const { s=status; } inline void gdd::setStatus(aitUint16 high, aitUint16 low) { status=(((aitUint32)high)<<16)|low; } -inline void gdd::getStatus(aitUint16& high, aitUint16& low) +inline void gdd::getStatus(aitUint16& high, aitUint16& low) const { high=(aitUint16)(status>>16); low=(aitUint16)(status&0x0000ffff); } inline void gdd::setStat(aitUint16 s) diff --git a/src/gdd/gddTest.cc b/src/gdd/gddTest.cc index e991a1173..b8e13cf74 100644 --- a/src/gdd/gddTest.cc +++ b/src/gdd/gddTest.cc @@ -4,6 +4,9 @@ // $Id$ // // $Log$ +// Revision 1.10 1999/04/30 00:05:20 jhill +// allow const / use cursor in dump +// // Revision 1.9 1997/08/05 00:51:16 jhill // fixed problems in aitString and the conversion matrix // @@ -290,7 +293,7 @@ void gddContainer::dump(void) const gdd::dumpInfo(); fprintf(stderr," total in container = %d\n",total()); - gddCursor cur = this->getCursor(); + constGddCursor cur = this->getCursor(); for(dd=cur.first();dd;dd=cur.next()) { if(dd->isAtomic()) { add=(gddAtomic*)dd; add->dump(); }