Remote Call Framework 3.2
SerializeDynamicArray.hpp
1 
2 //******************************************************************************
3 // RCF - Remote Call Framework
4 //
5 // Copyright (c) 2005 - 2020, Delta V Software. All rights reserved.
6 // http://www.deltavsoft.com
7 //
8 // RCF is distributed under dual licenses - closed source or GPL.
9 // Consult your particular license for conditions of use.
10 //
11 // If you have not purchased a commercial license, you are using RCF
12 // under GPL terms.
13 //
14 // Version: 3.2
15 // Contact: support <at> deltavsoft.com
16 //
17 //******************************************************************************
18 
19 #ifndef INCLUDE_SF_SERIALIZEDYNAMICARRAY_HPP
20 #define INCLUDE_SF_SERIALIZEDYNAMICARRAY_HPP
21 
22 #include <SF/SerializeFundamental.hpp>
23 #include <SF/SfNew.hpp>
24 
25 namespace SF {
26 
27  // serialize C-style dynamic arrays
28 
29  template<typename T, typename N>
30  class DynamicArray
31  {
32  public:
33  DynamicArray( const T *&pt, const N &n ) : pt_( const_cast< T*&>(pt) ), n_( const_cast<N &>(n) ) {}
34  DynamicArray( T *&pt, const N &n ) : pt_( const_cast< T*&>(pt) ), n_( const_cast<N &>(n) ) {}
35  DynamicArray(const DynamicArray &rhs) : pt_(rhs.pt_), n_(rhs.n_) {}
36  T *&get() { return pt_; }
37  N &length() { return n_; }
38  T &operator[](unsigned int idx) { RCF_ASSERT( get() != NULL && 0 <= idx && idx < length() ); return *(get() + idx); }
39  private:
40  DynamicArray &operator=(const DynamicArray &rhs); // Can't reassign reference members
41  T *&pt_;
42  N &n_;
43  };
44 
45  // If T is fundamental.
46  template<typename T, typename N>
47  inline void serializeDynamicArray(
48  RCF::TrueType *,
49  Archive &ar,
50  DynamicArray<T,N> &da)
51  {
52  if (ar.isRead())
53  {
54  I_Encoding &e = ar.getIstream()->getEncoding();
55  DataPtr data;
56  bool bRet = ar.getIstream()->get( data );
57  if (bRet)
58  {
59  UInt32 nCount = e.getCount( data , (T *) NULL);
60  da.get() = new T[ nCount ];
61  da.length() = nCount;
62  e.toObject(data, da.get(), nCount );
63  }
64  }
65  else if (ar.isWrite())
66  {
67  if (da.length() > 0)
68  {
69  I_Encoding &e = ar.getOstream()->getEncoding();
70  DataPtr data;
71  e.toData(data, da.get(), da.length() );
72  ar.getOstream()->put(data);
73  }
74  }
75  }
76 
77  // If T is non-fundamental.
78  template<typename T, typename N>
79  inline void serializeDynamicArray(
80  RCF::FalseType *,
81  Archive &ar,
82  DynamicArray<T,N> &da)
83  {
84  if (ar.isRead())
85  {
86  UInt32 nCount;
87  ar & nCount;
88  da.get() = new T[nCount];
89  da.length() = nCount;
90  for (UInt32 i=0; i<da.length(); i++)
91  ar & da[i];
92  }
93  else if (ar.isWrite())
94  {
95  ar & da.length();
96  for (UInt32 i=0; i<da.length(); i++)
97  ar & da[i];
98  }
99  }
100 
101  template<typename T, typename N>
102  inline void serialize(Archive &ar, DynamicArray<T,N> &da)
103  {
104  typedef typename RCF::IsFundamental<T>::type FundamentalOrNot;
105  serializeDynamicArray( (FundamentalOrNot *) NULL, ar, da);
106  }
107 
108  SF_NO_CTOR_T2( DynamicArray )
109 
110  template<typename T, typename N>
111  inline DynamicArray<T,N> dynamicArray(const T *&pt, const N &size)
112  {
113  return DynamicArray<T,N>(pt, size);
114  }
115 
116  template<typename T, typename N>
117  inline DynamicArray<T,N> dynamicArray( T *&pt, const N &size)
118  {
119  return DynamicArray<T,N>(pt, size);
120  }
121 
122 } // namespace SF
123 
124 #endif // ! INCLUDE_SF_SERIALIZEDYNAMICARRAY_HPP
Definition: ByteBuffer.hpp:189