Integration of OCCT 6.5.0 from SVN
[occt.git] / src / BinMDataStd / BinMDataStd_IntegerListDriver.cxx
1 // File:        BinMDataStd_IntegerListDriver.cxx
2 // Created:     May 29 11:40:00 2007
3 // Author:      Vlad Romashko
4 //              <vladislav.romashko@opencascade.com>
5 // Copyright:   Open CASCADE
6
7 #include <BinMDataStd_IntegerListDriver.ixx>
8 #include <TDataStd_IntegerList.hxx>
9 #include <TColStd_Array1OfInteger.hxx>
10 #include <TColStd_ListIteratorOfListOfInteger.hxx>
11
12 //=======================================================================
13 //function : BinMDataStd_IntegerListDriver
14 //purpose  : Constructor
15 //=======================================================================
16 BinMDataStd_IntegerListDriver::BinMDataStd_IntegerListDriver(const Handle(CDM_MessageDriver)& theMsgDriver)
17      : BinMDF_ADriver (theMsgDriver, STANDARD_TYPE(TDataStd_IntegerList)->Name())
18 {
19
20 }
21
22 //=======================================================================
23 //function : NewEmpty
24 //purpose  : 
25 //=======================================================================
26 Handle(TDF_Attribute) BinMDataStd_IntegerListDriver::NewEmpty() const
27 {
28   return new TDataStd_IntegerList();
29 }
30
31 //=======================================================================
32 //function : Paste
33 //purpose  : persistent -> transient (retrieve)
34 //=======================================================================
35 Standard_Boolean BinMDataStd_IntegerListDriver::Paste(const BinObjMgt_Persistent&  theSource,
36                                                       const Handle(TDF_Attribute)& theTarget,
37                                                       BinObjMgt_RRelocationTable&  ) const
38 {
39   Standard_Integer aIndex, aFirstInd, aLastInd;
40   if (! (theSource >> aFirstInd >> aLastInd))
41     return Standard_False;
42   const Standard_Integer aLength = aLastInd - aFirstInd + 1;
43   if (aLength <= 0)
44     return Standard_False;
45
46   TColStd_Array1OfInteger aTargetArray(aFirstInd, aLastInd);
47   theSource.GetIntArray (&aTargetArray(aFirstInd), aLength);
48
49   Handle(TDataStd_IntegerList) anAtt = Handle(TDataStd_IntegerList)::DownCast(theTarget);
50   for (aIndex = aFirstInd; aIndex <= aLastInd; aIndex++)
51   {
52     anAtt->Append(aTargetArray.Value(aIndex));
53   }
54   return Standard_True;
55 }
56
57 //=======================================================================
58 //function : Paste
59 //purpose  : transient -> persistent (store)
60 //=======================================================================
61 void BinMDataStd_IntegerListDriver::Paste(const Handle(TDF_Attribute)& theSource,
62                                           BinObjMgt_Persistent&        theTarget,
63                                           BinObjMgt_SRelocationTable&  ) const
64 {
65   Handle(TDataStd_IntegerList) anAtt = Handle(TDataStd_IntegerList)::DownCast(theSource);
66   const Standard_Integer aFirstInd = 1;
67   const Standard_Integer aLastInd  = anAtt->Extent();
68   const Standard_Integer aLength   = aLastInd - aFirstInd + 1;
69   if (aLength <= 0)
70     return;
71   theTarget << aFirstInd << aLastInd;
72   TColStd_Array1OfInteger aSourceArray(aFirstInd, aLastInd);
73   if (aLastInd >= 1)
74   {
75     TColStd_ListIteratorOfListOfInteger itr(anAtt->List());
76     for (Standard_Integer i = 1; itr.More(); itr.Next(), i++)
77     {
78       aSourceArray.SetValue(i, itr.Value());
79     }
80     Standard_Integer *aPtr = (Standard_Integer *) &aSourceArray(aFirstInd);
81     theTarget.PutIntArray(aPtr, aLength);
82   }
83 }