Warning, /include/opencascade/BinObjMgt_Persistent.lxx is written in an unsupported language. File is not indexed.
0001 // Created on: 2002-10-30
0002 // Created by: Michael SAZONOV
0003 // Copyright (c) 2002-2014 OPEN CASCADE SAS
0004 //
0005 // This file is part of Open CASCADE Technology software library.
0006 //
0007 // This library is free software; you can redistribute it and/or modify it under
0008 // the terms of the GNU Lesser General Public License version 2.1 as published
0009 // by the Free Software Foundation, with special exception defined in the file
0010 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
0011 // distribution for complete text of the license and disclaimer of any warranty.
0012 //
0013 // Alternatively, this file may be used under the terms of Open CASCADE
0014 // commercial license or contractual agreement.
0015
0016 #define BP_HEADSIZE ((Standard_Integer)(3 * sizeof(Standard_Integer)))
0017 #define BP_PIECESIZE 102400
0018
0019 //=======================================================================
0020 //function : SetId
0021 //purpose : Sets the Id of the object
0022 //=======================================================================
0023
0024 inline void BinObjMgt_Persistent::SetId (const Standard_Integer theId)
0025 {
0026 ((Standard_Integer*) myData(1)) [1] = theId;
0027 }
0028
0029 //=======================================================================
0030 //function : SetTypeId
0031 //purpose : Sets the Id of the type of the object
0032 //=======================================================================
0033
0034 inline void BinObjMgt_Persistent::SetTypeId (const Standard_Integer theTypeId)
0035 {
0036 ((Standard_Integer*) myData(1)) [0] = theTypeId;
0037 myStreamStart.Nullify();
0038 }
0039
0040 //=======================================================================
0041 //function : Id
0042 //purpose : Returns the Id of the object
0043 //=======================================================================
0044
0045 inline Standard_Integer BinObjMgt_Persistent::Id () const
0046 {
0047 return ((Standard_Integer*) myData(1)) [1];
0048 }
0049
0050 //=======================================================================
0051 //function : TypeId
0052 //purpose : Returns the Id of the type of the object
0053 //=======================================================================
0054
0055 inline Standard_Integer BinObjMgt_Persistent::TypeId () const
0056 {
0057 return ((Standard_Integer*) myData(1)) [0];
0058 }
0059
0060 //=======================================================================
0061 //function : Length
0062 //purpose : Returns the length of data
0063 //=======================================================================
0064
0065 inline Standard_Integer BinObjMgt_Persistent::Length () const
0066 {
0067 return mySize - BP_HEADSIZE;
0068 }
0069
0070 //=======================================================================
0071 //function : operator <<
0072 //purpose :
0073 //=======================================================================
0074
0075 inline Standard_OStream& operator << (Standard_OStream& theOS,
0076 BinObjMgt_Persistent& theObj)
0077 {
0078 return theObj.Write (theOS);
0079 }
0080
0081 //=======================================================================
0082 //function : operator >>
0083 //purpose :
0084 //=======================================================================
0085
0086 inline Standard_IStream& operator >> (Standard_IStream& theIS,
0087 BinObjMgt_Persistent& theObj)
0088 {
0089 return theObj.Read (theIS);
0090 }
0091
0092 //=======================================================================
0093 //function : Position
0094 //purpose : Tells the current position for get/put
0095 //=======================================================================
0096
0097 inline Standard_Integer BinObjMgt_Persistent::Position() const
0098 {
0099 return (myIndex-1) * BP_PIECESIZE + myOffset;
0100 }
0101
0102 //=======================================================================
0103 //function : SetPosition
0104 //purpose : Sets the current position for get/put.
0105 // Resets an error state depending on the validity of thePos.
0106 // Returns the new state (value of IsOK())
0107 //=======================================================================
0108
0109 inline Standard_Boolean BinObjMgt_Persistent::SetPosition
0110 (const Standard_Integer thePos) const
0111 {
0112 ((BinObjMgt_Persistent*)this)->myIndex = thePos / BP_PIECESIZE + 1;
0113 ((BinObjMgt_Persistent*)this)->myOffset = thePos % BP_PIECESIZE;
0114 ((BinObjMgt_Persistent*)this)->myIsError = thePos > mySize || thePos < BP_HEADSIZE;
0115 return !myIsError;
0116 }
0117
0118 //=======================================================================
0119 //function : Truncate
0120 //purpose : Truncates the buffer by current position,
0121 // i.e. updates mySize
0122 //=======================================================================
0123
0124 inline void BinObjMgt_Persistent::Truncate()
0125 {
0126 mySize = Position();
0127 }
0128
0129 //=======================================================================
0130 //function : IsError
0131 //purpose : Indicates an error after Get methods or SetPosition
0132 //=======================================================================
0133
0134 inline Standard_Boolean BinObjMgt_Persistent::IsError() const
0135 {
0136 return myIsError;
0137 }
0138
0139 //=======================================================================
0140 //function : IsOK
0141 //purpose : Indicates a good state after Get methods or SetPosition
0142 //=======================================================================
0143
0144 inline Standard_Boolean BinObjMgt_Persistent::IsOK() const
0145 {
0146 return !myIsError;
0147 }
0148
0149 //=======================================================================
0150 //function : alignOffset
0151 //purpose : Aligns myOffset to the given size;
0152 // enters the next piece if the end of the current one is reached;
0153 // toClear==true means to fill unused space by 0
0154 //=======================================================================
0155
0156 inline void BinObjMgt_Persistent::alignOffset
0157 (const Standard_Integer theSize,
0158 const Standard_Boolean toClear) const
0159 {
0160 unsigned alignMask = theSize - 1;
0161 Standard_Integer anOffset = (myOffset + alignMask) & ~alignMask;
0162
0163 if (anOffset > myOffset) {
0164 if (toClear && anOffset <= BP_PIECESIZE)
0165 memset ( ((char*)myData(myIndex)) + myOffset, 0, anOffset - myOffset);
0166 ((BinObjMgt_Persistent*)this)->myOffset = anOffset;
0167 }
0168
0169 // ensure there is a room for at least one item in the current piece
0170 if (myOffset >= BP_PIECESIZE) {
0171 ((BinObjMgt_Persistent*)this)->myIndex++;
0172 ((BinObjMgt_Persistent*)this)->myOffset = 0;
0173 }
0174 }
0175
0176 //=======================================================================
0177 //function : prepareForPut
0178 //purpose : Prepares the room for theSize bytes;
0179 // returns the number of pieces except for the current one
0180 // are to be occupied
0181 //=======================================================================
0182
0183 inline Standard_Integer BinObjMgt_Persistent::prepareForPut
0184 (const Standard_Integer theSize)
0185 {
0186 Standard_Integer nbPieces = (myOffset + theSize - 1) / BP_PIECESIZE;
0187 Standard_Integer nbToAdd = myIndex + nbPieces - myData.Length();
0188 if (nbToAdd > 0)
0189 // create needed pieces
0190 incrementData (nbToAdd);
0191 Standard_Integer aNewPosition = Position() + theSize;
0192 if (aNewPosition > mySize) mySize = aNewPosition;
0193 return nbPieces;
0194 }
0195
0196 //=======================================================================
0197 //function : noMoreData
0198 //purpose : Checks if there is no more data of the given size starting
0199 // from the current position in myData
0200 //=======================================================================
0201
0202 inline Standard_Boolean BinObjMgt_Persistent::noMoreData
0203 (const Standard_Integer theSize) const
0204 {
0205 ((BinObjMgt_Persistent*)this)->myIsError = Position() + theSize > mySize;
0206 return myIsError;
0207 }
0208
0209 //=======================================================================
0210 //function : PutBoolean
0211 //purpose :
0212 //=======================================================================
0213
0214 inline BinObjMgt_Persistent& BinObjMgt_Persistent::PutBoolean
0215 (const Standard_Boolean theValue)
0216 {
0217 return PutInteger ((Standard_Integer) theValue);
0218 }
0219
0220 //=======================================================================
0221 //function : GetBoolean
0222 //purpose :
0223 //=======================================================================
0224
0225 inline const BinObjMgt_Persistent& BinObjMgt_Persistent::GetBoolean
0226 (Standard_Boolean& theValue) const
0227 {
0228 // Standard_Integer anIntVal = (Standard_Integer) theValue;
0229 Standard_Integer anIntVal;
0230 GetInteger (anIntVal);
0231 theValue = anIntVal != 0;
0232 return *this;
0233 }