// Copyright (c) 2015 OPEN CASCADE SAS // // This file is part of Open CASCADE Technology software library. // // This library is free software; you can redistribute it and/or modify it under // the terms of the GNU Lesser General Public License version 2.1 as published // by the Free Software Foundation, with special exception defined in the file // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT // distribution for complete text of the license and disclaimer of any warranty. // // Alternatively, this file may be used under the terms of Open CASCADE // commercial license or contractual agreement. #ifndef _StdLPersistent_HArray1_HeaderFile #define _StdLPersistent_HArray1_HeaderFile #include "Standard_NotImplemented.hxx" #include "Standard_NullValue.hxx" #include "StdObjMgt_Persistent.hxx" #include "StdObjMgt_ReadData.hxx" #include "StdObjMgt_WriteData.hxx" #include "NCollection_HArray1.hxx" #include "Standard_Integer.hxx" #include "NCollection_Array1.hxx" class StdLPersistent_HArray1 { class base : public StdObjMgt_Persistent { public: //! Read persistent data from a file. Standard_EXPORT void Read(StdObjMgt_ReadData& theReadData) override; //! Write persistent data to a file. Standard_EXPORT void Write(StdObjMgt_WriteData& theWriteData) const override; protected: virtual int lowerBound() const = 0; virtual int upperBound() const = 0; virtual void createArray(const int theLowerBound, const int theUpperBound) = 0; virtual void readValue(StdObjMgt_ReadData& theReadData, const int theIndex) = 0; virtual void writeValue(StdObjMgt_WriteData& theWriteData, const int theIndex) const = 0; }; protected: template class instance : public base { friend class StdLPersistent_HArray1; public: typedef occ::handle ArrayHandle; typedef typename ArrayClass::value_type ValueType; typedef typename ArrayClass::Iterator Iterator; public: //! Get the array. const occ::handle& Array() const { return myArray; } protected: int lowerBound() const override { return myArray->Lower(); } int upperBound() const override { return myArray->Upper(); } void createArray(const int theLowerBound, const int theUpperBound) override { myArray = new ArrayClass(theLowerBound, theUpperBound); } void readValue(StdObjMgt_ReadData& theReadData, const int theIndex) override { theReadData >> myArray->ChangeValue(theIndex); } void writeValue(StdObjMgt_WriteData& theWriteData, const int theIndex) const override { theWriteData << myArray->Value(theIndex); } void PChildren(StdObjMgt_Persistent::SequenceOfPersistent& theChildren) const override { return PChildrenT(theChildren); } const char* PName() const override { return PNameT(); } const char* PNameT() const { throw Standard_NotImplemented("StdLPersistent_HArray1::instance::PName - not implemented"); } void PChildrenT(StdObjMgt_Persistent::SequenceOfPersistent&) const {} protected: occ::handle myArray; }; template class named_instance : public instance { friend class StdLPersistent_HArray1; public: const char* PName() const override { Standard_NullValue_Raise_if(!myPName, "StdLPersistent_HArray1::named_instance::PName - name not set"); return myPName; } protected: named_instance(const char* thePName) : myPName(thePName) { } const char* myPName; }; public: typedef instance> Integer; typedef instance> Real; typedef instance> Byte; typedef instance>> Persistent; public: template static Handle(instance) Translate(const ArrayClass& theArray) { Handle(instance) aPArray = new instance; aPArray->myArray = new ArrayClass(theArray.Lower(), theArray.Upper()); for (int i = theArray.Lower(); i <= theArray.Upper(); ++i) aPArray->myArray->ChangeValue(i) = theArray.Value(i); return aPArray; } template static Handle(instance) Translate(const char* thePName, const ArrayClass& theArray) { Handle(named_instance) aPArray = new named_instance(thePName); aPArray->myArray = new ArrayClass(theArray.Lower(), theArray.Upper()); for (int i = theArray.Lower(); i <= theArray.Upper(); ++i) aPArray->myArray->ChangeValue(i) = theArray.Value(i); return aPArray; } }; template <> inline const char* StdLPersistent_HArray1::instance>::PNameT() const { return "PColStd_HArray1OfInteger"; } template <> inline const char* StdLPersistent_HArray1::instance>::PNameT() const { return "PColStd_HArray1OfReal"; } template <> inline const char* StdLPersistent_HArray1::instance>::PNameT() const { return "PColStd_HArray1OfByte"; } inline StdObjMgt_ReadData& operator>>(StdObjMgt_ReadData& theReadData, uint8_t& theByte) { return theReadData >> reinterpret_cast(theByte); } inline StdObjMgt_WriteData& operator>>(StdObjMgt_WriteData& theWriteData, const uint8_t& theByte) { return theWriteData << reinterpret_cast(theByte); } template <> inline void StdLPersistent_HArray1:: instance>>::PChildrenT( StdObjMgt_Persistent::SequenceOfPersistent& theChildren) const { for (int i = myArray->Lower(); i <= myArray->Upper(); ++i) theChildren.Append(myArray->Value(i)); } #endif