xref: /AOO41X/main/io/source/stm/streamhelper.hxx (revision 36cac86ce6644abfc22dc9979c91a4f69c89786c)
1*36cac86cSAndrew Rist /**************************************************************
2cdf0e10cSrcweir  *
3*36cac86cSAndrew Rist  * Licensed to the Apache Software Foundation (ASF) under one
4*36cac86cSAndrew Rist  * or more contributor license agreements.  See the NOTICE file
5*36cac86cSAndrew Rist  * distributed with this work for additional information
6*36cac86cSAndrew Rist  * regarding copyright ownership.  The ASF licenses this file
7*36cac86cSAndrew Rist  * to you under the Apache License, Version 2.0 (the
8*36cac86cSAndrew Rist  * "License"); you may not use this file except in compliance
9*36cac86cSAndrew Rist  * with the License.  You may obtain a copy of the License at
10cdf0e10cSrcweir  *
11*36cac86cSAndrew Rist  *   http://www.apache.org/licenses/LICENSE-2.0
12cdf0e10cSrcweir  *
13*36cac86cSAndrew Rist  * Unless required by applicable law or agreed to in writing,
14*36cac86cSAndrew Rist  * software distributed under the License is distributed on an
15*36cac86cSAndrew Rist  * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16*36cac86cSAndrew Rist  * KIND, either express or implied.  See the License for the
17*36cac86cSAndrew Rist  * specific language governing permissions and limitations
18*36cac86cSAndrew Rist  * under the License.
19cdf0e10cSrcweir  *
20*36cac86cSAndrew Rist  *************************************************************/
21*36cac86cSAndrew Rist 
22*36cac86cSAndrew Rist 
23cdf0e10cSrcweir 
24cdf0e10cSrcweir // Save NDEBUG state
25cdf0e10cSrcweir #ifdef NDEBUG
26cdf0e10cSrcweir #define STREAMHELPER_HXX_HAD_NDEBUG
27cdf0e10cSrcweir #undef NDEBUG
28cdf0e10cSrcweir #endif
29cdf0e10cSrcweir 
30cdf0e10cSrcweir #if OSL_DEBUG_LEVEL == 0
31cdf0e10cSrcweir #define NDEBUG
32cdf0e10cSrcweir #endif
33cdf0e10cSrcweir #include <assert.h>
34cdf0e10cSrcweir 
35cdf0e10cSrcweir #define Max( a, b )     (((a)>(b)) ? (a) : (b) )
36cdf0e10cSrcweir #define Min( a, b )		(((a)<(b)) ? (a) : (b) )
37cdf0e10cSrcweir 
38cdf0e10cSrcweir namespace io_stm {
39cdf0e10cSrcweir 
40cdf0e10cSrcweir class IFIFO_OutOfBoundsException :
41cdf0e10cSrcweir 				public Exception
42cdf0e10cSrcweir {};
43cdf0e10cSrcweir 
44cdf0e10cSrcweir class IFIFO_OutOfMemoryException :
45cdf0e10cSrcweir 				public Exception
46cdf0e10cSrcweir {};
47cdf0e10cSrcweir 
48cdf0e10cSrcweir class IFIFO
49cdf0e10cSrcweir {
50cdf0e10cSrcweir public:
51cdf0e10cSrcweir 
52cdf0e10cSrcweir 
53cdf0e10cSrcweir 	virtual void 	write( const Sequence<sal_Int8> &) throw( IFIFO_OutOfMemoryException,
54cdf0e10cSrcweir 															  IFIFO_OutOfBoundsException )=0;
55cdf0e10cSrcweir 
56cdf0e10cSrcweir 	virtual void 	read( Sequence<sal_Int8> & , sal_Int32 nBytesToRead )
57cdf0e10cSrcweir 													throw( IFIFO_OutOfBoundsException )=0;
58cdf0e10cSrcweir 	virtual void 	skip( sal_Int32 nBytesToSkip )
59cdf0e10cSrcweir 										throw( IFIFO_OutOfBoundsException )=0;
60cdf0e10cSrcweir 	virtual sal_Int32 	getSize() const throw(  )  =0;
61cdf0e10cSrcweir 	virtual void 	shrink() throw() = 0;
62cdf0e10cSrcweir 
~IFIFO()63cdf0e10cSrcweir 	virtual ~IFIFO() {};
64cdf0e10cSrcweir };
65cdf0e10cSrcweir 
66cdf0e10cSrcweir 
67cdf0e10cSrcweir class IRingBuffer_OutOfBoundsException :
68cdf0e10cSrcweir 				public Exception
69cdf0e10cSrcweir {};
70cdf0e10cSrcweir 
71cdf0e10cSrcweir class IRingBuffer_OutOfMemoryException :
72cdf0e10cSrcweir 				public Exception
73cdf0e10cSrcweir {};
74cdf0e10cSrcweir 
75cdf0e10cSrcweir class IRingBuffer
76cdf0e10cSrcweir {
77cdf0e10cSrcweir public:
78cdf0e10cSrcweir 	/***
79cdf0e10cSrcweir 	* overwrites data at given position. Size is automatically extended, when
80cdf0e10cSrcweir 	* data is written beyond end.
81cdf0e10cSrcweir 	*
82cdf0e10cSrcweir 	***/
83cdf0e10cSrcweir 
84cdf0e10cSrcweir 	virtual void 	writeAt( sal_Int32 nPos, const Sequence<sal_Int8> &)
85cdf0e10cSrcweir 		throw( IRingBuffer_OutOfMemoryException,
86cdf0e10cSrcweir 			   IRingBuffer_OutOfBoundsException )=0;
87cdf0e10cSrcweir 	virtual void 	readAt( sal_Int32 nPos, Sequence<sal_Int8> & , sal_Int32 nBytesToRead ) const
88cdf0e10cSrcweir 		throw( IRingBuffer_OutOfBoundsException )=0;
89cdf0e10cSrcweir 	virtual sal_Int32 	getSize() const throw(  )  =0;
90cdf0e10cSrcweir 	virtual void 	forgetFromStart( sal_Int32 nBytesToForget ) throw(IRingBuffer_OutOfBoundsException)=0;
91cdf0e10cSrcweir 	virtual void	forgetFromEnd( sal_Int32 nBytesToForget ) throw(IRingBuffer_OutOfBoundsException)=0;
92cdf0e10cSrcweir 	virtual void 	shrink() throw() = 0;
~IRingBuffer()93cdf0e10cSrcweir 	virtual ~IRingBuffer() {};
94cdf0e10cSrcweir };
95cdf0e10cSrcweir 
96cdf0e10cSrcweir 
97cdf0e10cSrcweir class MemRingBuffer :
98cdf0e10cSrcweir 		public IRingBuffer
99cdf0e10cSrcweir {
100cdf0e10cSrcweir public:
101cdf0e10cSrcweir 	MemRingBuffer();
102cdf0e10cSrcweir 	virtual ~MemRingBuffer();
103cdf0e10cSrcweir 
104cdf0e10cSrcweir 	virtual void 	writeAt( sal_Int32 nPos, const Sequence<sal_Int8> &)
105cdf0e10cSrcweir 													throw(	IRingBuffer_OutOfMemoryException,
106cdf0e10cSrcweir 																IRingBuffer_OutOfBoundsException );
107cdf0e10cSrcweir 	virtual void 	readAt( sal_Int32 nPos, Sequence<sal_Int8> & , sal_Int32 nBytesToRead ) const
108cdf0e10cSrcweir 													throw( IRingBuffer_OutOfBoundsException );
109cdf0e10cSrcweir 	virtual sal_Int32 	getSize() const throw(  );
110cdf0e10cSrcweir 	virtual void 	forgetFromStart( sal_Int32 nBytesToForget ) throw(IRingBuffer_OutOfBoundsException);
111cdf0e10cSrcweir 	virtual void	forgetFromEnd( sal_Int32 nBytesToForget ) throw(IRingBuffer_OutOfBoundsException);
112cdf0e10cSrcweir 
113cdf0e10cSrcweir 	virtual void shrink() throw();
114cdf0e10cSrcweir 
115cdf0e10cSrcweir private:
116cdf0e10cSrcweir 
117cdf0e10cSrcweir 	void resizeBuffer( sal_Int32 nMinSize ) throw( IRingBuffer_OutOfMemoryException );
checkInvariants()118cdf0e10cSrcweir 	inline void checkInvariants()
119cdf0e10cSrcweir 	{
120cdf0e10cSrcweir 		assert( m_nBufferLen >= 0 );
121cdf0e10cSrcweir 		assert( m_nOccupiedBuffer >= 0 );
122cdf0e10cSrcweir 		assert( m_nOccupiedBuffer <= m_nBufferLen );
123cdf0e10cSrcweir 		assert( m_nStart >= 0 );
124cdf0e10cSrcweir 		assert( 0 == m_nStart || m_nStart < m_nBufferLen );
125cdf0e10cSrcweir 	}
126cdf0e10cSrcweir 
127cdf0e10cSrcweir 	sal_Int8 	*m_p;
128cdf0e10cSrcweir 	sal_Int32 	m_nBufferLen;
129cdf0e10cSrcweir 	sal_Int32 	m_nStart;
130cdf0e10cSrcweir 	sal_Int32 	m_nOccupiedBuffer;
131cdf0e10cSrcweir };
132cdf0e10cSrcweir 
133cdf0e10cSrcweir 
134cdf0e10cSrcweir class MemFIFO :
135cdf0e10cSrcweir 		public  IFIFO,
136cdf0e10cSrcweir 		private MemRingBuffer
137cdf0e10cSrcweir {
138cdf0e10cSrcweir public:
139cdf0e10cSrcweir 	virtual void 	write( const Sequence<sal_Int8> &) throw( IFIFO_OutOfMemoryException,
140cdf0e10cSrcweir 															  IFIFO_OutOfBoundsException );
141cdf0e10cSrcweir 	virtual void 	read( Sequence<sal_Int8> & , sal_Int32 nBytesToRead )
142cdf0e10cSrcweir 													throw( IFIFO_OutOfBoundsException );
143cdf0e10cSrcweir 	virtual void 	skip( sal_Int32 nBytesToSkip ) throw( IFIFO_OutOfBoundsException );
getSize() const144cdf0e10cSrcweir 	virtual sal_Int32 	getSize()  const throw(  )
145cdf0e10cSrcweir 						{ return MemRingBuffer::getSize(); }
shrink()146cdf0e10cSrcweir 	virtual void 	shrink() throw()
147cdf0e10cSrcweir 						{ MemRingBuffer::shrink(); }
148cdf0e10cSrcweir 
149cdf0e10cSrcweir };
150cdf0e10cSrcweir 
151cdf0e10cSrcweir // Restore NDEBUG state
152cdf0e10cSrcweir #ifdef STREAMHELPER_HXX_HAD_NDEBUG
153cdf0e10cSrcweir #define NDEBUG
154cdf0e10cSrcweir #else
155cdf0e10cSrcweir #undef NDEBUG
156cdf0e10cSrcweir #endif
157cdf0e10cSrcweir 
158cdf0e10cSrcweir }
159