0027772: Foundation Classes - define Standard_Boolean using C++ type "bool" instead...
[occt.git] / src / StdLPersistent / StdLPersistent_Collection.hxx
1 // Copyright (c) 2015 OPEN CASCADE SAS
2 //
3 // This file is part of Open CASCADE Technology software library.
4 //
5 // This library is free software; you can redistribute it and/or modify it under
6 // the terms of the GNU Lesser General Public License version 2.1 as published
7 // by the Free Software Foundation, with special exception defined in the file
8 // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT
9 // distribution for complete text of the license and disclaimer of any warranty.
10 //
11 // Alternatively, this file may be used under the terms of Open CASCADE
12 // commercial license or contractual agreement.
13
14
15 #ifndef _StdLPersistent_Collection_HeaderFile
16 #define _StdLPersistent_Collection_HeaderFile
17
18 #include <StdObjMgt_Attribute.hxx>
19 #include <StdLPersistent_HArray1.hxx>
20
21 #include <TDataStd_IntegerArray.hxx>
22 #include <TDataStd_RealArray.hxx>
23 #include <TDataStd_ByteArray.hxx>
24 #include <TDataStd_ExtStringArray.hxx>
25 #include <TDataStd_BooleanArray.hxx>
26 #include <TDataStd_ReferenceArray.hxx>
27 #include <TDataStd_IntegerList.hxx>
28 #include <TDataStd_RealList.hxx>
29 #include <TDataStd_ExtStringList.hxx>
30 #include <TDataStd_BooleanList.hxx>
31 #include <TDataStd_ReferenceList.hxx>
32 #include <TDataStd_IntPackedMap.hxx>
33
34
35 class StdLPersistent_Collection
36 {
37   // Converters
38   struct noConversion;
39   struct byteConverter;
40   struct boolConverter;
41   struct stringConverter;
42   struct referenceConverter;
43
44   // Base templates
45   template <class Base>
46   class booleanArrayBase : public Base
47   {
48   public:
49     //! Read persistent data from a file.
50     Standard_EXPORT virtual void Read (StdObjMgt_ReadData& theReadData);
51
52   protected:
53     template <class ArrayHandle, class Converter>
54     inline void import (const ArrayHandle& theArray, Converter theConverter)
55       const;
56
57   protected:
58     Standard_Integer myLower;
59     Standard_Integer myUpper;
60   };
61
62   template <class Base>
63   class directArrayBase : public Base
64   {
65   protected:
66     template <class ArrayHandle, class Converter>
67     inline void import (const ArrayHandle& theArray, Converter theConverter)
68       const;
69   };
70
71   template <class Base>
72   class arrayBase : public Base
73   {
74   protected:
75     template <class ArrayHandle, class Converter>
76     inline void import (const ArrayHandle& theArray, Converter theConverter)
77       const;
78   };
79
80   template <class Base>
81   class listBase : public Base
82   {
83   protected:
84     template <class ArrayHandle, class Converter>
85     inline void import (const ArrayHandle& theArray, Converter theConverter)
86       const;
87   };
88
89   template <class Base>
90   class mapBase : public Base
91   {
92   protected:
93     template <class ArrayHandle, class Converter>
94     inline void import (const ArrayHandle& theArray, Converter theConverter)
95       const;
96   };
97
98   // Instance templates
99   template <template<class> class BaseT,
100             class HArrayClass,
101             class AttribClass,
102             class Converter>
103   class instance
104     : public BaseT <typename StdObjMgt_Attribute<AttribClass>::SingleRef>
105   {
106   public:
107     //! Import transient attribuite from the persistent data.
108     Standard_EXPORT virtual void ImportAttribute();
109   };
110
111   template <class Instance>
112   class instance_1 : public Instance
113   {
114   public:
115     //! Read persistent data from a file.
116     Standard_EXPORT virtual void Read (StdObjMgt_ReadData& theReadData);
117
118     //! Import transient attribuite from the persistent data.
119     Standard_EXPORT virtual void ImportAttribute();
120
121   private:
122     Standard_Boolean myDelta;
123   };
124
125
126   // Collection type specialization
127   template<class HArrayClass, class AttribClass, class Converter = noConversion>
128   struct booleanArrayT
129     : instance<booleanArrayBase, HArrayClass, AttribClass, Converter> {};
130
131   template<class HArrayClass, class AttribClass, class Converter = noConversion>
132   struct directArrayT
133     : instance<directArrayBase, HArrayClass, AttribClass, Converter> {};
134
135   template<class HArrayClass, class AttribClass, class Converter = noConversion>
136   struct arrayT
137     : instance<arrayBase, HArrayClass, AttribClass, Converter> {};
138
139   template<class HArrayClass, class AttribClass, class Converter = noConversion>
140   struct listT
141     : instance<listBase, HArrayClass, AttribClass, Converter> {};
142
143   template<class HArrayClass, class AttribClass, class Converter = noConversion>
144   struct mapT
145     : instance<mapBase, HArrayClass, AttribClass, Converter> {};
146
147
148   // Internal array types
149   typedef StdLPersistent_HArray1::Integer    integer;
150   typedef StdLPersistent_HArray1::Real       real;
151   typedef StdLPersistent_HArray1::Persistent persistent;
152
153 public:
154   // Final specialization
155   typedef booleanArrayT <integer, TDataStd_BooleanArray, byteConverter>
156     BooleanArray;
157
158   typedef directArrayT <integer, TDataStd_IntegerArray>
159     IntegerArray;
160
161   typedef directArrayT <real, TDataStd_RealArray>
162     RealArray;
163
164   typedef arrayT <integer, TDataStd_ByteArray, byteConverter>
165     ByteArray;
166
167   typedef arrayT <persistent, TDataStd_ExtStringArray, stringConverter>
168     ExtStringArray;
169
170   typedef arrayT <persistent, TDataStd_ReferenceArray, referenceConverter>
171     ReferenceArray;
172
173   typedef listT <integer, TDataStd_IntegerList>
174     IntegerList;
175
176   typedef listT <real, TDataStd_RealList>
177     RealList;
178
179   typedef listT <integer, TDataStd_BooleanList, boolConverter>
180     BooleanList;
181
182   typedef listT <persistent, TDataStd_ExtStringList, stringConverter>
183     ExtStringList;
184
185   typedef listT <persistent, TDataStd_ReferenceList, referenceConverter>
186     ReferenceList;
187
188   typedef mapT <integer, TDataStd_IntPackedMap>
189     IntPackedMap;
190
191   typedef instance_1<IntegerArray>    IntegerArray_1;
192   typedef instance_1<RealArray>       RealArray_1;
193   typedef instance_1<ByteArray>       ByteArray_1;
194   typedef instance_1<ExtStringArray>  ExtStringArray_1;
195   typedef instance_1<IntPackedMap>    IntPackedMap_1;
196 };
197
198 #endif