You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
291 lines
7.5 KiB
291 lines
7.5 KiB
/*****************************************************************************/ |
|
// 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 |
|
|
|
/*****************************************************************************/
|
|
|