Back to home page

EIC code displayed by LXR

 
 

    


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 }