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