Although this method is dangerous, it still (or, maybe, especially) needs to be documented. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@78055 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
		
			
				
	
	
		
			415 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
			
		
		
	
	
			415 lines
		
	
	
		
			12 KiB
		
	
	
	
		
			Objective-C
		
	
	
	
	
	
| /////////////////////////////////////////////////////////////////////////////
 | |
| // Name:        buffer.h
 | |
| // Purpose:     interface of wxMemoryBuffer
 | |
| // Author:      wxWidgets team
 | |
| // Licence:     wxWindows licence
 | |
| /////////////////////////////////////////////////////////////////////////////
 | |
| 
 | |
| 
 | |
| /**
 | |
|     wxScopedCharTypeBuffer<T> is a template class for storing characters.
 | |
| 
 | |
|     Data are stored in reference-counted buffer. In other words, making a copy
 | |
|     of wxScopedCharTypeBuffer<T> will @em not make another copy of the stored
 | |
|     string data, it will still point to the same location in memory.
 | |
| 
 | |
|     wxScopedCharTypeBuffer<T> supports two storage modes: owned and non-owned.
 | |
|     "Owned" data buffer (created with CreateOwned() or wxCharTypeBuffer<T>
 | |
|     derived class) owns the data and frees them when the last buffer pointing
 | |
|     to them is destroyed.
 | |
| 
 | |
|     "Non-owned" buffer (created with CreateNonOwned()), on the other hand,
 | |
|     references data owned by somebody else -- typical use is by
 | |
|     wxString::mb_str() or wxString::wc_str(), which may return non-owned buffer
 | |
|     pointing to wxString's internal store.
 | |
| 
 | |
|     Because of this, the validity of data stored in wxScopedCharTypeBuffer<T>
 | |
|     is limited by the lifetime of the "parent" object that created the
 | |
|     buffer (e.g. the wxString on which mb_str() was called).
 | |
| 
 | |
|     If you need to preserve the data for longer, assign it to
 | |
|     wxCharTypeBuffer<T> instead of wxScopedCharTypeBuffer<T>. On the other
 | |
|     hand, use wxScopedCharTypeBuffer<T> if the buffer is to be destroyed before
 | |
|     the "parent" object -- typical use would be creating it on the stack and
 | |
|     destroying when it goes out of scope (hence the class' name).
 | |
| 
 | |
|     @tparam T
 | |
|         The type of the characters stored in this class.
 | |
| 
 | |
|     @since 2.9.0
 | |
| 
 | |
|     @nolibrary
 | |
|     @category{data}
 | |
| */
 | |
| template <typename T>
 | |
| class wxScopedCharTypeBuffer
 | |
| {
 | |
| public:
 | |
|     /// Stored characters type.
 | |
|     typedef T CharType;
 | |
| 
 | |
|     /// Default constructor, creates NULL buffer.
 | |
|     wxScopedCharTypeBuffer();
 | |
| 
 | |
|     /**
 | |
|         Creates non-owned buffer from string data @a str.
 | |
| 
 | |
|         The buffer's destructor will not destroy @a str. The returned buffer's
 | |
|         data is valid only as long as @a str is valid.
 | |
| 
 | |
|         @param str String data.
 | |
|         @param len If specified, length of the string, otherwise the string
 | |
|                    is considered to be NUL-terminated.
 | |
|      */
 | |
|     static const wxScopedCharTypeBuffer CreateNonOwned(const CharType *str, size_t len = wxNO_LEN);
 | |
| 
 | |
|     /**
 | |
|         Creates owned buffer from @a str and takes ownership of it.
 | |
| 
 | |
|         The buffer's destructor will free @a str when its reference count
 | |
|         reaches zero (initial count is 1).
 | |
| 
 | |
|         @param str String data.
 | |
|         @param len If specified, length of the string, otherwise the string
 | |
|                    is considered to be NUL-terminated.
 | |
|      */
 | |
|     static const wxScopedCharTypeBuffer CreateOwned(CharType *str, size_t len = wxNO_LEN);
 | |
| 
 | |
|     /**
 | |
|         Copy constructor.
 | |
| 
 | |
|         Increases reference count on the data, does @em not make wxStrdup()
 | |
|         copy of the data.
 | |
|      */
 | |
|     wxScopedCharTypeBuffer(const wxScopedCharTypeBuffer& src);
 | |
| 
 | |
|     /// Assignment operator behaves in the same way as the copy constructor.
 | |
|     wxScopedCharTypeBuffer& operator=(const wxScopedCharTypeBuffer& src);
 | |
| 
 | |
|     /**
 | |
|         Destructor. Frees stored data if it is in "owned" mode and data's
 | |
|         reference count reaches zero.
 | |
|      */
 | |
|     ~wxScopedCharTypeBuffer();
 | |
| 
 | |
|     /**
 | |
|         Returns the internal pointer and resets the buffer.
 | |
| 
 | |
|         It's the caller responsibility to deallocate the returned pointer using
 | |
|         @c free() function.
 | |
| 
 | |
|         Notice that this method is dangerous because it can only be called on a
 | |
|         non-shared owning buffer. Calling it on any other kind of buffer object
 | |
|         will result in a crash after the pointer is freed, so avoid using it
 | |
|         unless absolutely necessary and you are absolutely certain that the
 | |
|         buffer is not shared.
 | |
|      */
 | |
|     CharType* release() const;
 | |
| 
 | |
|     /// Resets the buffer to NULL, freeing the data if necessary.
 | |
|     void reset();
 | |
| 
 | |
|     /// Returns pointer to the stored data.
 | |
|     CharType *data();
 | |
| 
 | |
|     /// Returns const pointer to the stored data.
 | |
|     const CharType *data() const;
 | |
| 
 | |
|     /// Returns length of the string stored.
 | |
|     size_t length() const;
 | |
| 
 | |
|     /// Implicit conversion to C string.
 | |
|     operator const CharType *() const;
 | |
| 
 | |
|     /// Random access to the stored C string.
 | |
|     CharType operator[](size_t n) const;
 | |
| };
 | |
| 
 | |
| /// Scoped char buffer.
 | |
| typedef wxScopedCharTypeBuffer<char> wxScopedCharBuffer;
 | |
| 
 | |
| /// Scoped wchar_t buffer.
 | |
| typedef wxScopedCharTypeBuffer<wchar_t> wxScopedWCharBuffer;
 | |
| 
 | |
| /**
 | |
|     wxCharTypeBuffer<T> is a template class for storing characters.
 | |
| 
 | |
|     The difference from wxScopedCharTypeBuffer<T> is that this class
 | |
|     doesn't have non-owned mode and the data stored in it are valid for
 | |
|     as long as the buffer instance exists. Other than that, this class'
 | |
|     behaviour is the same as wxScopedCharTypeBuffer<T>'s -- in particular,
 | |
|     the data are reference-counted and copying the buffer is cheap.
 | |
| 
 | |
|     wxScopedCharTypeBuffer<T> buffers can be converted into wxCharTypeBuffer<T>.
 | |
| 
 | |
|     @tparam T
 | |
|         The type of the characters stored in this class.
 | |
| 
 | |
|     @since 2.9.0
 | |
| 
 | |
|     @nolibrary
 | |
|     @category{data}
 | |
| */
 | |
| template <typename T>
 | |
| class wxCharTypeBuffer : public wxScopedCharTypeBuffer<T>
 | |
| {
 | |
| public:
 | |
|     /**
 | |
|         Creates (owned) buffer from @a str and takes ownership of it.
 | |
| 
 | |
|         @param str String data.
 | |
|         @param len If specified, length of the string, otherwise the string
 | |
|                    is considered to be NUL-terminated.
 | |
| 
 | |
|         @see wxScopedCharTypeBuffer<T>::CreateOwned()
 | |
|      */
 | |
|     wxCharTypeBuffer(const CharType *str = NULL, size_t len = wxNO_LEN);
 | |
| 
 | |
| 
 | |
|     /**
 | |
|         Creates (owned) buffer of size @a len.
 | |
| 
 | |
|         @see wxScopedCharTypeBuffer<T>::CreateOwned()
 | |
|      */
 | |
|     wxCharTypeBuffer(size_t len);
 | |
| 
 | |
|     /**
 | |
|         Copy constructor.
 | |
| 
 | |
|         Increases reference count on the data, does @em not make wxStrdup()
 | |
|         copy of the data.
 | |
|      */
 | |
|     wxCharTypeBuffer(const wxCharTypeBuffer& src);
 | |
| 
 | |
|     /**
 | |
|         Makes a copy of scoped buffer @a src.
 | |
| 
 | |
|         If @a src is a non-owned buffer, a copy of its data is made using
 | |
|         wxStrdup(). If @a src is an owned buffer, this constructor behaves
 | |
|         in the usual way (reference count on buffer data is incremented).
 | |
|      */
 | |
|     wxCharTypeBuffer(const wxScopedCharTypeBuffer<T>& src);
 | |
| 
 | |
|     /**
 | |
|         Assigns @a str to this buffer and takes ownership of it (i.e.\ the
 | |
|         buffer becomes "owned").
 | |
|      */
 | |
|     wxCharTypeBuffer& operator=(const CharType *str);
 | |
| 
 | |
|     /// Assignment operator behaves in the same way as the copy constructor.
 | |
|     wxCharTypeBuffer& operator=(const wxCharTypeBuffer& src);
 | |
| 
 | |
|     /**
 | |
|         Assigns a scoped buffer to this buffer.
 | |
| 
 | |
|         If @a src is a non-owned buffer, a copy of its data is made using
 | |
|         wxStrdup(). If @a src is an owned buffer, the assignment behaves
 | |
|         in the usual way (reference count on buffer data is incremented).
 | |
|      */
 | |
|     wxCharTypeBuffer& operator=(const wxScopedCharTypeBuffer<T>& src);
 | |
| 
 | |
|     /**
 | |
|         Extends the buffer to have size @a len.
 | |
| 
 | |
|         Can only be called on buffers that don't share data with another
 | |
|         buffer (i.e. reference count of the data is 1).
 | |
| 
 | |
|         @see shrink()
 | |
|      */
 | |
|     bool extend(size_t len);
 | |
| 
 | |
|     /**
 | |
|         Shrinks the buffer to have size @a len and NUL-terminates the string
 | |
|         at this length.
 | |
| 
 | |
|         Can only be called on buffers that don't share data with another
 | |
|         buffer (i.e. reference count of the data is 1).
 | |
| 
 | |
|         @param len Length to shrink to. Must not be larger than current length.
 | |
| 
 | |
|         @note The string is not reallocated to take less memory.
 | |
| 
 | |
|         @since 2.9.0
 | |
| 
 | |
|         @see extend()
 | |
|      */
 | |
|     bool shrink(size_t len);
 | |
| };
 | |
| 
 | |
| /**
 | |
|     This is a specialization of wxCharTypeBuffer<T> for @c char type.
 | |
| 
 | |
|     @nolibrary
 | |
|     @category{data}
 | |
| */
 | |
| class wxCharBuffer : public wxCharTypeBuffer<char>
 | |
| {
 | |
| public:
 | |
|     typedef wxCharTypeBuffer<char> wxCharTypeBufferBase;
 | |
|     typedef wxScopedCharTypeBuffer<char> wxScopedCharTypeBufferBase;
 | |
| 
 | |
|     wxCharBuffer(const wxCharTypeBufferBase& buf);
 | |
|     wxCharBuffer(const wxScopedCharTypeBufferBase& buf);
 | |
|     wxCharBuffer(const CharType *str = NULL);
 | |
|     wxCharBuffer(size_t len);
 | |
|     wxCharBuffer(const wxCStrData& cstr);
 | |
| };
 | |
| 
 | |
| /**
 | |
|     This is a specialization of wxCharTypeBuffer<T> for @c wchar_t type.
 | |
| 
 | |
|     @nolibrary
 | |
|     @category{data}
 | |
| */
 | |
| class wxWCharBuffer : public wxCharTypeBuffer<wchar_t>
 | |
| {
 | |
| public:
 | |
|     typedef wxCharTypeBuffer<wchar_t> wxCharTypeBufferBase;
 | |
|     typedef wxScopedCharTypeBuffer<wchar_t> wxScopedCharTypeBufferBase;
 | |
| 
 | |
|     wxWCharBuffer(const wxCharTypeBufferBase& buf);
 | |
|     wxWCharBuffer(const wxScopedCharTypeBufferBase& buf);
 | |
|     wxWCharBuffer(const CharType *str = NULL);
 | |
|     wxWCharBuffer(size_t len);
 | |
|     wxWCharBuffer(const wxCStrData& cstr);
 | |
| };
 | |
| 
 | |
| /**
 | |
|     @class wxMemoryBuffer
 | |
| 
 | |
|     A @b wxMemoryBuffer is a useful data structure for storing arbitrary sized
 | |
|     blocks of memory. wxMemoryBuffer guarantees deletion of the memory block when
 | |
|     the object is destroyed.
 | |
| 
 | |
|     @library{wxbase}
 | |
|     @category{data}
 | |
| */
 | |
| class wxMemoryBuffer
 | |
| {
 | |
| public:
 | |
|     /**
 | |
|         Copy constructor, refcounting is used for performance, but wxMemoryBuffer
 | |
|         is not a copy-on-write structure so changes made to one buffer effect all
 | |
|         copies made from it.
 | |
| 
 | |
|         @see @ref overview_refcount
 | |
|     */
 | |
|     wxMemoryBuffer(const wxMemoryBuffer& src);
 | |
| 
 | |
|     /**
 | |
|         Create a new buffer.
 | |
| 
 | |
|         @param size
 | |
|             size of the new buffer, 1KiB by default.
 | |
|     */
 | |
|     wxMemoryBuffer(size_t size = 1024);
 | |
| 
 | |
|     /**
 | |
|         Append a single byte to the buffer.
 | |
| 
 | |
|         @param data
 | |
|             New byte to append to the buffer.
 | |
|     */
 | |
|     void AppendByte(char data);
 | |
| 
 | |
|     /**
 | |
|         Single call to append a data block to the buffer.
 | |
| 
 | |
|         @param data
 | |
|             Pointer to block to append to the buffer.
 | |
|         @param len
 | |
|             Length of data to append.
 | |
|     */
 | |
|     void AppendData(const void *data, size_t len);
 | |
| 
 | |
|     /**
 | |
|         Clear the buffer contents.
 | |
| 
 | |
|         The buffer won't contain any data after this method is called.
 | |
| 
 | |
|         @see IsEmpty()
 | |
| 
 | |
|         @since 2.9.4
 | |
|      */
 | |
|     void Clear();
 | |
| 
 | |
|     /**
 | |
|         Ensure that the buffer is big enough and return a pointer to the start
 | |
|         of the empty space in the buffer. This pointer can be used to directly
 | |
|         write data into the buffer, this new data will be appended to the
 | |
|         existing data.
 | |
| 
 | |
|         @param sizeNeeded
 | |
|             Amount of extra space required in the buffer for
 | |
|             the append operation
 | |
|     */
 | |
|     void* GetAppendBuf(size_t sizeNeeded);
 | |
| 
 | |
|     /**
 | |
|         Returns the size of the buffer.
 | |
|     */
 | |
|     size_t GetBufSize() const;
 | |
| 
 | |
|     /**
 | |
|         Return a pointer to the data in the buffer.
 | |
|     */
 | |
|     void* GetData() const;
 | |
| 
 | |
|     /**
 | |
|         Returns the length of the valid data in the buffer.
 | |
|     */
 | |
|     size_t GetDataLen() const;
 | |
| 
 | |
|     /**
 | |
|         Ensure the buffer is big enough and return a pointer to the
 | |
|         buffer which can be used to directly write into the buffer
 | |
|         up to @a sizeNeeded bytes.
 | |
|     */
 | |
|     void* GetWriteBuf(size_t sizeNeeded);
 | |
| 
 | |
|     /**
 | |
|         Returns true if the buffer contains no data.
 | |
| 
 | |
|         @see Clear()
 | |
| 
 | |
|         @since 2.9.4
 | |
|      */
 | |
|     bool IsEmpty() const;
 | |
| 
 | |
|     /**
 | |
|         Ensures the buffer has at least @a size bytes available.
 | |
|     */
 | |
|     void SetBufSize(size_t size);
 | |
| 
 | |
|     /**
 | |
|         Sets the length of the data stored in the buffer.
 | |
|         Mainly useful for truncating existing data.
 | |
| 
 | |
|         @param size
 | |
|             New length of the valid data in the buffer. This is
 | |
|             distinct from the allocated size
 | |
|     */
 | |
|     void SetDataLen(size_t size);
 | |
| 
 | |
|     /**
 | |
|         Update the length after completing a direct append, which
 | |
|         you must have used GetAppendBuf() to initialise.
 | |
| 
 | |
|         @param sizeUsed
 | |
|             This is the amount of new data that has been
 | |
|             appended.
 | |
|     */
 | |
|     void UngetAppendBuf(size_t sizeUsed);
 | |
| 
 | |
|     /**
 | |
|         Update the buffer after completing a direct write, which
 | |
|         you must have used GetWriteBuf() to initialise.
 | |
| 
 | |
|         @param sizeUsed
 | |
|             The amount of data written in to buffer
 | |
|             by the direct write
 | |
|     */
 | |
|     void UngetWriteBuf(size_t sizeUsed);
 | |
| };
 | |
| 
 |