/*****************************************************************************/ // Copyright 2006-2007 Adobe Systems Incorporated // All Rights Reserved. // // NOTICE: Adobe permits you to use, modify, and distribute this file in // accordance with the terms of the Adobe license agreement accompanying it. /*****************************************************************************/ /* $Id: //mondo/dng_sdk_1_4/dng_sdk/source/dng_ref_counted_block.h#2 $ */ /* $DateTime: 2012/07/31 22:04:34 $ */ /* $Change: 840853 $ */ /* $Author: tknoll $ */ /** Support for a refcounted block, with optional copy-on-write */ /*****************************************************************************/ #ifndef __dng_ref_counted_block__ #define __dng_ref_counted_block__ /*****************************************************************************/ #include "dng_types.h" #include "dng_mutex.h" /*****************************************************************************/ /// \brief Class to provide resource acquisition is instantiation discipline /// for small memory allocations. /// /// This class does not use dng_memory_allocator for memory allocation. class dng_ref_counted_block { private: struct header { dng_mutex fMutex; uint32 fRefCount; uint32 fSize; header (uint32 size) : fMutex ("dng_ref_counted_block") , fRefCount (1) , fSize (size) { } ~header () { } }; void *fBuffer; public: /// Construct an empty memory buffer using malloc. /// \exception dng_memory_full with fErrorCode equal to dng_error_memory. dng_ref_counted_block (); /// Construct memory buffer of size bytes using malloc. /// \param size Number of bytes of memory needed. /// \exception dng_memory_full with fErrorCode equal to dng_error_memory. dng_ref_counted_block (uint32 size); /// Release memory buffer using free. ~dng_ref_counted_block (); /// Copy constructore, which takes a reference to data and does not copy the block. dng_ref_counted_block (const dng_ref_counted_block &data); /// Assignment operatore takes a reference to right hand side and does not copy the data. dng_ref_counted_block & operator= (const dng_ref_counted_block &data); /// Clear existing memory buffer and allocate new memory of size bytes. /// \param size Number of bytes of memory needed. /// \exception dng_memory_full with fErrorCode equal to dng_error_memory. void Allocate (uint32 size); /// Release any allocated memory using free. Object is still valid and /// Allocate can be called again. void Clear (); /// If there is only one reference, do nothing, otherwise copy the data into a new block and return an object with that block as the data. void EnsureWriteable (); /// Return pointer to allocated memory as a void *.. /// \retval void * valid for as many bytes as were allocated. uint32 LogicalSize () { return ((header *)fBuffer)->fSize; } void * Buffer () { return (void *)((char *)fBuffer + sizeof (header)); } /// Return pointer to allocated memory as a const void *. /// \retval const void * valid for as many bytes as were allocated. const void * Buffer () const { return (const void *)((char *)fBuffer + sizeof (header)); } /// Return pointer to allocated memory as a char *. /// \retval char * valid for as many bytes as were allocated. char * Buffer_char () { return (char *) Buffer (); } /// Return pointer to allocated memory as a const char *. /// \retval const char * valid for as many bytes as were allocated. const char * Buffer_char () const { return (const char *) Buffer (); } /// Return pointer to allocated memory as a uint8 *. /// \retval uint8 * valid for as many bytes as were allocated. uint8 * Buffer_uint8 () { return (uint8 *) Buffer (); } /// Return pointer to allocated memory as a const uint8 *. /// \retval const uint8 * valid for as many bytes as were allocated. const uint8 * Buffer_uint8 () const { return (const uint8 *) Buffer (); } /// Return pointer to allocated memory as a uint16 *. /// \retval uint16 * valid for as many bytes as were allocated. uint16 * Buffer_uint16 () { return (uint16 *) Buffer (); } /// Return pointer to allocated memory as a const uint16 *. /// \retval const uint16 * valid for as many bytes as were allocated. const uint16 * Buffer_uint16 () const { return (const uint16 *) Buffer (); } /// Return pointer to allocated memory as a int16 *. /// \retval int16 * valid for as many bytes as were allocated. int16 * Buffer_int16 () { return (int16 *) Buffer (); } /// Return pointer to allocated memory as a const int16 *. /// \retval const int16 * valid for as many bytes as were allocated. const int16 * Buffer_int16 () const { return (const int16 *) Buffer (); } /// Return pointer to allocated memory as a uint32 *. /// \retval uint32 * valid for as many bytes as were allocated. uint32 * Buffer_uint32 () { return (uint32 *) Buffer (); } /// Return pointer to allocated memory as a uint32 *. /// \retval uint32 * valid for as many bytes as were allocated. const uint32 * Buffer_uint32 () const { return (const uint32 *) Buffer (); } /// Return pointer to allocated memory as a const int32 *. /// \retval const int32 * valid for as many bytes as were allocated. int32 * Buffer_int32 () { return (int32 *) Buffer (); } /// Return pointer to allocated memory as a const int32 *. /// \retval const int32 * valid for as many bytes as were allocated. const int32 * Buffer_int32 () const { return (const int32 *) Buffer (); } /// Return pointer to allocated memory as a uint64 *. /// \retval uint64 * valid for as many bytes as were allocated. uint64 * Buffer_uint64 () { return (uint64 *) Buffer (); } /// Return pointer to allocated memory as a uint64 *. /// \retval uint64 * valid for as many bytes as were allocated. const uint64 * Buffer_uint64 () const { return (const uint64 *) Buffer (); } /// Return pointer to allocated memory as a const int64 *. /// \retval const int64 * valid for as many bytes as were allocated. int64 * Buffer_int64 () { return (int64 *) Buffer (); } /// Return pointer to allocated memory as a const int64 *. /// \retval const int64 * valid for as many bytes as were allocated. const int64 * Buffer_int64 () const { return (const int64 *) Buffer (); } /// Return pointer to allocated memory as a real32 *. /// \retval real32 * valid for as many bytes as were allocated. real32 * Buffer_real32 () { return (real32 *) Buffer (); } /// Return pointer to allocated memory as a const real32 *. /// \retval const real32 * valid for as many bytes as were allocated. const real32 * Buffer_real32 () const { return (const real32 *) Buffer (); } /// Return pointer to allocated memory as a real64 *. /// \retval real64 * valid for as many bytes as were allocated. real64 * Buffer_real64 () { return (real64 *) Buffer (); } /// Return pointer to allocated memory as a const real64 *. /// \retval const real64 * valid for as many bytes as were allocated. const real64 * Buffer_real64 () const { return (const real64 *) Buffer (); } }; /*****************************************************************************/ #endif /*****************************************************************************/