0030675: Visualization - remove redundant proxy classes in hierarchy of PrsMgr_Presen...
[occt.git] / src / Standard / Standard_ArrayStreamBuffer.cxx
CommitLineData
a5460e9d 1// Copyright (c) 2016 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#include <Standard_ArrayStreamBuffer.hxx>
15
16// =======================================================================
17// function : Standard_ArrayStreamBuffer
18// purpose :
19// =======================================================================
20Standard_ArrayStreamBuffer::Standard_ArrayStreamBuffer (const char* theBegin,
21 const size_t theSize)
22: myBegin (theBegin),
23 myEnd (theBegin + theSize),
24 myCurrent(theBegin)
25{
26 //
27}
28
29// =======================================================================
30// function : ~Standard_ArrayStreamBuffer
31// purpose :
32// =======================================================================
33Standard_ArrayStreamBuffer::~Standard_ArrayStreamBuffer()
34{
35 //
36}
37
38// =======================================================================
39// function : Init
40// purpose :
41// =======================================================================
42void Standard_ArrayStreamBuffer::Init (const char* theBegin,
43 const size_t theSize)
44{
45 myBegin = theBegin;
46 myEnd = theBegin + theSize;
47 myCurrent = theBegin;
48}
49
50// =======================================================================
51// function : underflow
52// purpose :
53// =======================================================================
54Standard_ArrayStreamBuffer::int_type Standard_ArrayStreamBuffer::underflow()
55{
56 if (myCurrent == myEnd)
57 {
58 return traits_type::eof();
59 }
60
61 return traits_type::to_int_type(*myCurrent);
62}
63
64// =======================================================================
65// function : uflow
66// purpose :
67// =======================================================================
68Standard_ArrayStreamBuffer::int_type Standard_ArrayStreamBuffer::uflow()
69{
70 if (myCurrent == myEnd)
71 {
72 return traits_type::eof();
73 }
74
75 return traits_type::to_int_type(*myCurrent++);
76}
77
78// =======================================================================
79// function : pbackfail
80// purpose :
81// =======================================================================
82Standard_ArrayStreamBuffer::int_type Standard_ArrayStreamBuffer::pbackfail (int_type ch)
83{
84 if (myCurrent == myBegin
85 || (ch != traits_type::eof()
86 && ch != myCurrent[-1]))
87 {
88 return traits_type::eof();
89 }
90
91 return traits_type::to_int_type(*--myCurrent);
92}
93
94// =======================================================================
95// function : showmanyc
96// purpose :
97// =======================================================================
98std::streamsize Standard_ArrayStreamBuffer::showmanyc()
99{
100 if (myCurrent > myEnd)
101 {
102 // assert
103 }
104 return myEnd - myCurrent;
105}
106
107// =======================================================================
108// function : seekoff
109// purpose :
110// =======================================================================
111Standard_ArrayStreamBuffer::pos_type Standard_ArrayStreamBuffer::seekoff (off_type theOff,
112 std::ios_base::seekdir theWay,
113 std::ios_base::openmode theWhich)
114{
115 switch (theWay)
116 {
117 case std::ios_base::beg:
118 {
119 myCurrent = myBegin + theOff;
120 if (myCurrent >= myEnd)
121 {
122 myCurrent = myEnd;
123 }
124 break;
125 }
126 case std::ios_base::cur:
127 {
128 myCurrent += theOff;
129 if (myCurrent >= myEnd)
130 {
131 myCurrent = myEnd;
132 }
133 break;
134 }
135 case std::ios_base::end:
136 {
137 myCurrent = myEnd - theOff;
138 if (myCurrent < myBegin)
139 {
140 myCurrent = myBegin;
141 }
142 break;
143 }
144 default:
145 {
146 break;
147 }
148 }
149 (void )theWhich;
150 return myCurrent - myBegin;
151}
152
153// =======================================================================
154// function : seekpos
155// purpose :
156// =======================================================================
157Standard_ArrayStreamBuffer::pos_type Standard_ArrayStreamBuffer::seekpos (pos_type thePosition,
158 std::ios_base::openmode theWhich)
159{
160 return seekoff (off_type(thePosition), std::ios_base::beg, theWhich);
161}
162
163// =======================================================================
164// function : xsgetn
165// purpose :
166// =======================================================================
167std::streamsize Standard_ArrayStreamBuffer::xsgetn (char* thePtr,
168 std::streamsize theCount)
169{
170 const char* aCurrent = myCurrent + theCount;
171 if (aCurrent >= myEnd)
172 {
173 aCurrent = myEnd;
174 }
175 size_t aCopied = aCurrent - myCurrent;
176 if (aCopied == 0)
177 {
178 return 0;
179 }
180 memcpy (thePtr, myCurrent, aCopied);
181 myCurrent = aCurrent;
182 return aCopied;
183}