zjf
2023-03-06 392b76515f40376b6d36f40a114850ef63650384
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
/////////////////////////////////////////////////////////////////////////////// 
// Copyright (C) 2002-2016, Open Design Alliance (the "Alliance"). 
// All rights reserved. 
// 
// This software and its documentation and related materials are owned by 
// the Alliance. The software may only be incorporated into application 
// programs owned by members of the Alliance, subject to a signed 
// Membership Agreement and Supplemental Software License Agreement with the
// Alliance. The structure and organization of this software are the valuable  
// trade secrets of the Alliance and its suppliers. The software is also 
// protected by copyright law and international treaty provisions. Application  
// programs incorporating this software must include the following statement 
// with their copyright notices:
//   
//   This application incorporates Teigha(R) software pursuant to a license 
//   agreement with Open Design Alliance.
//   Teigha(R) Copyright (C) 2002-2016 by Open Design Alliance. 
//   All rights reserved.
//
// By use of this software, its documentation or related materials, you 
// acknowledge and accept the above terms.
///////////////////////////////////////////////////////////////////////////////
 
 
 
 
// FlatMemStream.h: interface for the OdMemoryStream class.
//
//////////////////////////////////////////////////////////////////////
 
#if !defined(_ODFLATMEMSTREAM_H_INCLUDED_)
#define _ODFLATMEMSTREAM_H_INCLUDED_
 
#include "TD_PackPush.h"
 
#include "OdStreamBuf.h"
 
class OdFlatMemStream;
/** \details
    This template class is a specialization of the OdSmartPtr class for OdFlatMemStream object pointers.
*/
typedef OdSmartPtr<OdFlatMemStream> OdFlatMemStreamPtr;
 
/** \details
    Default formal parameter for the lightweight template instaniations.
    OdFlatMemStreamImpl<OdStreamBuf> -- instaniation with OdStreamBuf
    OdFlatMemStreamImpl<> -- lightweight instaniation without abstract interface overhead
    <group Other_Classes>
*/
class OdEmptyBaseClass {};
 
/** \details
    This class implements memory-resident I/O objects.
    Library: TD_Root
    <group Other_Classes>
*/
template <class TBase = OdEmptyBaseClass>
class OdFlatMemStreamImpl : public TBase {
protected:
  void*     m_pMemData;
  OdUInt64  m_nEndPos;
  OdUInt64  m_nCurPos;
  /** \details
    Returns the raw data associated with this FlatMemStream object.
  */
  OdUInt8* data() { return (OdUInt8*)m_pMemData; }
  /** \details
    Returns the number of unused bytes in this FlatMemStream object.
  */
  OdUInt64 left() { return m_nEndPos - m_nCurPos; }
  /** \details
    Appends the specified number of bytes to this FlatMemStream object.
    \param numBytes [in]  Number of bytes.
    \note
    The default implementation of this function does nothing but throw an eNotOpenForWrite exception
  */
  virtual void append(OdUInt64 numBytes) { throw OdError(eNotOpenForWrite); }
 
  /** \param buffer [in]  Character buffer.
    \param numBytes [in]  Number of bytes.
    \param curPosition [in]  Initial position of the file pointer.
  */
public:
  inline OdFlatMemStreamImpl() { init(0, 0, 0); }
 
  OdFlatMemStreamImpl(void* buffer, OdUInt64 numBytes, OdUInt64 nCurPos)
  { init(buffer, numBytes, nCurPos); }
 
  /** \details
    Initializes this FlatMemStream object.
    \param buffer [in]  Character buffer.
    \param numBytes [in]  Number of bytes.
    \param curPosition [in]  Initial position of the file pointer of the new object.
  */
  inline void init(void* buffer, OdUInt64 numBytes, OdUInt64 curPosition = 0);
 
  OdUInt64 length() { return m_nEndPos; }
  OdUInt64 tell() { return m_nCurPos; }
  OdUInt64 seek(OdInt64 offset, OdDb::FilerSeekType seekType);
 
  bool isEof() { return left()==0; }
  OdUInt8 getByte();
  void getBytes(void* buffer, OdUInt32 numBytes);
  
  // overrides existing byte(s)
  void putByte(OdUInt8 value);
  void putBytes(const void* buffer, OdUInt32 numBytes);
};
 
 
/** \details
    This class implements memory-resident I/O objects.
    Library: TD_Root
    <group Other_Classes>
*/
class FIRSTDLL_EXPORT OdFlatMemStream : public OdFlatMemStreamImpl<OdStreamBuf>
{
protected:
  inline OdFlatMemStream() {}
public:
  ODRX_DECLARE_MEMBERS(OdFlatMemStream);
  /** \details
    Creates a new FlatMemStream object, and returns a SmartPointer to the new object.
    \param buffer [in]  Character buffer.
    \param numBytes [in]  Number of bytes.
    \param curPosition [in]  Initial position of the file pointer of the new object.
  */
  static OdFlatMemStreamPtr createNew(void* buffer, OdUInt64 numBytes, OdUInt64 curPosition = 0);
 
  void copyDataTo(OdStreamBuf* pDestination, OdUInt64 sourceStart, OdUInt64 sourceEnd);
};
 
 
 
 
template<class TBase>
inline void OdFlatMemStreamImpl<TBase>::init(void* pMemData, OdUInt64 nSize, OdUInt64 nCurPos) {
  m_pMemData = pMemData;
  m_nEndPos = nCurPos + nSize;
  m_nCurPos = nCurPos;
}
 
 
template<class TBase>
inline OdUInt64 OdFlatMemStreamImpl<TBase>::seek(OdInt64 offset, OdDb::FilerSeekType whence) {
  OdUInt64 nNewPos;
  switch(whence) {
  case OdDb::kSeekFromEnd:
    nNewPos = m_nEndPos + offset;
    break;
  case OdDb::kSeekFromCurrent:
    nNewPos = m_nCurPos + offset;
    break;
  case OdDb::kSeekFromStart:
    nNewPos = offset;
    break;
  default:
    throw OdError(eInvalidInput);
    break;
  };
  if(nNewPos > m_nEndPos)
    throw OdError(eEndOfFile);
  return (m_nCurPos = nNewPos);
}
 
template<class TBase>
inline OdUInt8 OdFlatMemStreamImpl<TBase>::getByte() {
  if(left()==0)
    throw OdError(eEndOfFile);
  return *(data() + m_nCurPos++);
}
 
template<class TBase>
inline void OdFlatMemStreamImpl<TBase>::getBytes(void* buffer, OdUInt32 nLen) {
  if(left() < nLen)
    throw OdError(eEndOfFile);
  ::memcpy(buffer, data()+m_nCurPos, nLen);
  m_nCurPos += nLen;
}
 
template<class TBase>
inline void OdFlatMemStreamImpl<TBase>::putByte(OdUInt8 val) {
  if(m_nCurPos < m_nEndPos)
    *(data() + m_nCurPos++) = val;
  else
    throw OdError(eEndOfFile);
}
 
template<class TBase>
inline void OdFlatMemStreamImpl<TBase>::putBytes(const void* buffer, OdUInt32 nLen) {
  if(m_nCurPos + nLen <= m_nEndPos) {
    ::memcpy(data()+m_nCurPos, buffer, nLen);
    m_nCurPos += nLen;
  } else {
    throw OdError(eEndOfFile);
  }
}
 
 
#include "TD_PackPop.h"
 
#endif // !defined(_ODFLATMEMSTREAM_H_INCLUDED_)