Oracle® Fusion Middleware C++ API Reference for Oracle Coherence
14c (14.1.1.0.0)

F23533-01

coherence/io/OctetArrayWriteBuffer.hpp

00001 /*
00002 * OctetArrayWriteBuffer.hpp
00003 *
00004 * Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.
00005 *
00006 * Oracle is a registered trademarks of Oracle Corporation and/or its
00007 * affiliates.
00008 *
00009 * This software is the confidential and proprietary information of Oracle
00010 * Corporation. You shall not disclose such confidential and proprietary
00011 * information and shall use it only in accordance with the terms of the
00012 * license agreement you entered into with Oracle.
00013 *
00014 * This notice may not be removed or altered.
00015 */
00016 #ifndef COH_OCTET_ARRAY_WRITE_BUFFER_HPP
00017 #define COH_OCTET_ARRAY_WRITE_BUFFER_HPP
00018 
00019 #include "coherence/lang.ns"
00020 
00021 #include "coherence/io/AbstractWriteBuffer.hpp"
00022 #include "coherence/io/ReadBuffer.hpp"
00023 
00024 #include <limits>
00025 
00026 COH_OPEN_NAMESPACE2(coherence,io)
00027 
00028 
00029 /**
00030 * OctetArrayWriteBuffer is an implementation of WriteBuffer on an octet
00031 * array. It is designed to support both fixed length buffers and resizable
00032 * buffers.
00033 *
00034 * This implementation is explicitly not thread-safe.
00035 *
00036 * @author jh  2007.01.11
00037 */
00038 class COH_EXPORT OctetArrayWriteBuffer
00039     : public cloneable_spec<OctetArrayWriteBuffer,
00040         extends<AbstractWriteBuffer> >
00041     {
00042     friend class factory<OctetArrayWriteBuffer>;
00043 
00044     // ----- handle definitions (needed for nested classes) -----------------
00045 
00046     public:
00047         typedef this_spec::Handle Handle;
00048         typedef this_spec::View   View;
00049         typedef this_spec::Holder Holder;
00050 
00051 
00052     // ----- constructors ---------------------------------------------------
00053 
00054     protected:
00055         /**
00056         * Construct an OctetArrayWriteBuffer on an octet array.
00057         *
00058         * @param hab  an octet array
00059         *
00060         * @throws NullPointerException if <tt>hab</tt> is NULL
00061         */
00062         OctetArrayWriteBuffer(Array<octet_t>::Handle hab);
00063 
00064         /**
00065         * Construct an OctetArrayWriteBuffer with a certain initial capacity
00066         * and a certain maximum capacity.
00067         *
00068         * @param cbCap  initial capacity
00069         * @param cbMax  maximum capacity
00070         *
00071         * @throws IllegalArgumentException if <tt>cbCap</tt> is greater than
00072         *         <tt>cbMax</tt>
00073         */
00074         OctetArrayWriteBuffer(size32_t cbCap,
00075                 size32_t cbMax = (std::numeric_limits<size32_t>::max)());
00076 
00077         /**
00078         * Copy constructor.
00079         */
00080         OctetArrayWriteBuffer(const OctetArrayWriteBuffer& that);
00081 
00082 
00083     // ----- WriteBuffer interface ------------------------------------------
00084 
00085     public:
00086         /**
00087         * {@inheritDoc}
00088         */
00089         virtual size32_t length() const;
00090 
00091         /**
00092         * {@inheritDoc}
00093         */
00094         virtual size32_t getCapacity() const;
00095 
00096         /**
00097         * {@inheritDoc}
00098         */
00099         virtual size32_t getMaximumCapacity() const;
00100 
00101         /**
00102         * {@inheritDoc}
00103         */
00104         virtual void write(size32_t ofDest, octet_t b);
00105 
00106         /**
00107         * {@inheritDoc}
00108         */
00109         virtual void write(size32_t ofDest, Array<octet_t>::View vabSrc,
00110                 size32_t ofSrc, size32_t cbSrc);
00111 
00112         /**
00113         * {@inheritDoc}
00114         */
00115         virtual void write(size32_t ofDest, ReadBuffer::View vBufSrc,
00116                 size32_t ofSrc, size32_t cbSrc);
00117 
00118         /**
00119         * {@inheritDoc}
00120         */
00121         using AbstractWriteBuffer::write;
00122 
00123         /**
00124         * {@inheritDoc}
00125         */
00126         virtual void retain(size32_t of, size32_t cb);
00127 
00128         /**
00129         * {@inheritDoc}
00130         */
00131         using AbstractWriteBuffer::retain;
00132 
00133         /**
00134         * {@inheritDoc}
00135         */
00136         virtual ReadBuffer::View getUnsafeReadBuffer() const;
00137 
00138 
00139     // ----- internal methods -----------------------------------------------
00140 
00141     protected:
00142         /**
00143         * {@inheritDoc}
00144         */
00145         virtual BufferOutput::Handle instantiateBufferOutput();
00146 
00147         /**
00148         * Validate the ranges for the passed bounds and make sure that the
00149         * underlying array is big enough to handle them.
00150         *
00151         * @param of  the offset that data is about to be written to
00152         * @param cb  the length of the data that is about to be written
00153         */
00154         virtual void checkBounds(size32_t of, size32_t cb);
00155 
00156         /**
00157         * Grow the underlying octet array to at least the specified size.
00158         *
00159         * @param cbCap  the required or requested capacity
00160         */
00161         virtual void grow(size32_t cbCap);
00162 
00163         /**
00164         * Update the length if the passed length is greater than the current
00165         * buffer length.
00166         *
00167         * @param cb  the count of the last octet written (or the index of
00168         *            the next octet to write)
00169         */
00170         virtual void updateLength(size32_t cb);
00171 
00172 
00173     // ----- OctetArrayBufferOutput inner class -----------------------------
00174 
00175     public:
00176         /**
00177         * OctetArrayBufferOutput is an implementation of BufferOutput
00178         * optimized for writing to the buffer's underlying octet array. A
00179         * BufferOutput implementation that delegates to a BufferOutput
00180         * implementation, except that its offset range is shifted and
00181         * limited.
00182         *
00183         * @author jh  2008.01.11
00184         */
00185         class COH_EXPORT OctetArrayBufferOutput
00186             : public class_spec<OctetArrayBufferOutput,
00187                 extends<AbstractBufferOutput> >
00188             {
00189             friend class factory<OctetArrayBufferOutput>;
00190 
00191             // ----- constructors ---------------------------------------
00192 
00193             protected:
00194                 /**
00195                 * Create a new OctetArrayBufferOutput instance that delegates
00196                 * to the given OctetArrayWriteBuffer.
00197                 *
00198                 * @param hBuf  the delegate WriteBuffer
00199                 */
00200                 OctetArrayBufferOutput(OctetArrayWriteBuffer::Handle hBuf);
00201 
00202             // ----- BufferOutput interface -----------------------------
00203 
00204             public:
00205                 /**
00206                 * {@inheritDoc}
00207                 */
00208                 virtual void writeChar16(wchar16_t ch);
00209 
00210                 /**
00211                 * {@inheritDoc}
00212                 */
00213                 virtual void writeString(String::View vs);
00214 
00215                 /**
00216                 * {@inheritDoc}
00217                 */
00218                 virtual void writeInt16(int16_t n);
00219 
00220                 /**
00221                 * {@inheritDoc}
00222                 */
00223                 virtual void writeInt32(int32_t n);
00224 
00225                 /**
00226                 * {@inheritDoc}
00227                 */
00228                 virtual void writeInt64(int64_t n);
00229 
00230                 /**
00231                 * {@inheritDoc}
00232                 */
00233                 virtual void writeFloat32(float32_t fl);
00234 
00235                 /**
00236                 * {@inheritDoc}
00237                 */
00238                 virtual void writeFloat64(float64_t dfl);
00239 
00240             // ----- internal methods -----------------------------------
00241 
00242             protected:
00243                 /**
00244                 * Move the offset within the stream forward.
00245                 *
00246                 * @param cb  the number of octets to advance the offset
00247                 */
00248                 virtual void moveOffset(size32_t cb);
00249 
00250             // ----- data members ---------------------------------------
00251 
00252             protected:
00253                 /**
00254                  * The delegate write buffer.
00255                  */
00256                 FinalHandle<OctetArrayWriteBuffer> f_hBuf;
00257             };
00258 
00259 
00260     // ----- Object interface -----------------------------------------------
00261 
00262     protected:
00263         /**
00264         * {@inheritDoc}
00265         */
00266         virtual void onEscape(bool fEscaped) const;
00267 
00268 
00269     // ----- data members ---------------------------------------------------
00270 
00271     protected:
00272         /**
00273         * The octet array that holds the binary data.
00274         */
00275         MemberHandle<Array<octet_t> > m_hab;
00276 
00277         /**
00278          * Raw pointer to byte[] within m_hab, or NULL if this object is
00279          * escaped which would make its use impossible to prove as safe.
00280          */
00281         mutable octet_t* m_pab;
00282 
00283         /**
00284          * The cached size of m_hab.
00285          */
00286         size32_t m_cbab;
00287 
00288         /**
00289         * Number of octets in the octet array that have been written by this
00290         * WriteBuffer. This is the length.
00291         */
00292         size32_t m_cb;
00293 
00294         /**
00295         * Number of octets that the octet array can be grown to. This is the
00296         * maximum capacity.
00297         */
00298         size32_t m_cbMax;
00299 
00300         /**
00301         * Cached ReadBuffer to quickly provide an answer to
00302         * {@link #getUnsafeReadBuffer()}.
00303         */
00304         mutable MemberHandle<ReadBuffer> m_hBufUnsafe;
00305     };
00306 
00307 COH_CLOSE_NAMESPACE2
00308 
00309 #endif // COH_OCTET_ARRAY_WRITE_BUFFER_HPP
Copyright © 2000, 2020, Oracle and/or its affiliates. All rights reserved.