📄 valuebasic.cpp
字号:
/****************License************************************************ * * Copyright 2000-2003. ScanSoft, Inc. * * Use of this software is subject to notices and obligations set forth * in the SpeechWorks Public License - Software Version 1.2 which is * included with this software. * * ScanSoft is a registered trademark of ScanSoft, Inc., and OpenSpeech, * SpeechWorks and the SpeechWorks logo are registered trademarks or * trademarks of SpeechWorks International, Inc. in the United States * and other countries. * ***********************************************************************/ #include <stdio.h> #ifdef WIN32 #define WIN32_LEAN_AND_MEAN #include <windows.h> // For InterlockedIncrement/Decrement #else #include "VXItrd.h" // For VXItrdMutex #endif #define VXIVALUE_EXPORTS #include "Value.hpp" /** * Get the type of a Value * * @param v Value to check * @return Type of value */ VXIVALUE_API VXIvalueType VXIValueGetType(const VXIValue *v) { if ( v == NULL ) return (VXIvalueType) 0xFFFFFFFF; return v->GetType( ); } /** * Generic Value destructor * * This automatically invokes the appropriate type specific * destructor. * * @param v Value to destroy */ VXIVALUE_API void VXIValueDestroy(VXIValue **v) { if (( v != NULL ) && ( *v != NULL )) { delete *v; *v = NULL; } } /** * Generic Value clone * * This automatically invokes the appropriate type specific clone * operation. * * @param v Value to clone * @return Clone of v, NULL on error */ VXIVALUE_API VXIValue *VXIValueClone(const VXIValue *v) { if ( v == NULL ) return NULL; VXIValue *obj = NULL; switch ( v->GetType( ) ) { case VALUE_BOOLEAN: obj = new VXIBoolean (*(const VXIBoolean *) v); break; case VALUE_INTEGER: obj = new VXIInteger (*(const VXIInteger *) v); break; case VALUE_FLOAT: obj = new VXIFloat (*(const VXIFloat *) v); break; case VALUE_STRING: obj = (VXIValue *) VXIStringClone ((const VXIString *) v); break; case VALUE_PTR: obj = new VXIPtr (*(const VXIPtr *) v); break; case VALUE_CONTENT: { VXIContent *c = new VXIContent (*(const VXIContent *) v); if (( c ) && ( c->GetContent( ) == NULL )) { delete c; c = NULL; } obj = (VXIValue *) c; } break; case VALUE_MAP: obj = (VXIValue *) VXIMapClone ((const VXIMap *) v); break; case VALUE_VECTOR: obj = (VXIValue *) VXIVectorClone ((const VXIVector *) v); break; default: ; // Error but nothing we can do } return obj; } /** * Create a Boolean from a 32 bit boolean * * @param n VXIbool boolean value, either TRUE or FALSE * @return Boolean with the specified value on success, * NULL otherwise */ VXIVALUE_API VXIBoolean *VXIBooleanCreate(VXIbool n) { return new VXIBoolean (n); } /** * Boolean destructor * * @param i Boolean to destroy */ VXIVALUE_API void VXIBooleanDestroy(VXIBoolean **i) { if (( i != NULL ) && ( *i != NULL ) && ( (*i)->GetType( ) == VALUE_BOOLEAN )) { delete *i; *i = NULL; } } /** * Get the value of an Boolean * * @param i Boolean to obtain the value from * @return VXIbool boolean value, either TRUE or FALSE */ VXIVALUE_API VXIbool VXIBooleanValue(const VXIBoolean *i) { if (( i == NULL ) || ( i->GetType( ) != VALUE_BOOLEAN )) return FALSE; return i->GetValue( ); } /** * Create an Integer from a 32 bit integer * * @param n 32 bit integer value * @return Integer with the specified value on success, * NULL otherwise */ VXIVALUE_API VXIInteger *VXIIntegerCreate(VXIint32 n) { return new VXIInteger (n); } /** * Integer destructor * * @param i Integer to destroy */ VXIVALUE_API void VXIIntegerDestroy(VXIInteger **i) { if (( i != NULL ) && ( *i != NULL ) && ( (*i)->GetType( ) == VALUE_INTEGER )) { delete *i; *i = NULL; } } /** * Get the value of an Integer * * @param i Integer to obtain the value from * @return 32 bit integer value */ VXIVALUE_API VXIint32 VXIIntegerValue(const VXIInteger *i) { if (( i == NULL ) || ( i->GetType( ) != VALUE_INTEGER )) return (VXIint32) 0xFFFFFFFF; return i->GetValue( ); } /** * Create a Float from a 32 bit floating point number * * @param n 32 bit floating point value * @return Float with the specified value on success, * NULL otherwise */ VXIVALUE_API VXIFloat *VXIFloatCreate(VXIflt32 n) { return new VXIFloat (n); } /** * Float destructor * * @param f Float to destroy */ VXIVALUE_API void VXIFloatDestroy(VXIFloat **f) { if (( f != NULL ) && ( *f != NULL ) && ( (*f)->GetType( ) == VALUE_FLOAT )) { delete *f; *f = NULL; } } /** * Get the value of a Float * * @param f Float to get the value from * @return 32 bit floating point value */ VXIVALUE_API VXIflt32 VXIFloatValue(const VXIFloat *f) { if (( f == NULL ) || ( f->GetType( ) != VALUE_FLOAT )) return (VXIflt32) 0xFFFFFFFF; return f->GetValue( ); } /** * Create a Ptr from a C pointer * * Note: This only stores the pointer blindly, it does not perform a * deep copy and the reference memory is not freed on * destruction. Thus the user is responsible for ensuring the * referenced memory location remains valid, and for freeing memory * when appropriate on Ptr destruction. * * @param n Pointer to memory * @return Ptr with the specified value and type on success, * NULL otherwise */ VXIVALUE_API VXIPtr *VXIPtrCreate(void *n) { return new VXIPtr (n); } /** * Ptr destructor * * @param p Ptr to destroy */ VXIVALUE_API void VXIPtrDestroy(VXIPtr **p) { if (( p != NULL ) && ( *p != NULL ) && ( (*p)->GetType( ) == VALUE_PTR )) { delete *p; *p = NULL; } } /** * Get the value of a Ptr * * @param p Ptr to retrieve the pointer from * @return Pointer to memory retrieved */ VXIVALUE_API void *VXIPtrValue(const VXIPtr *p) { if (( p == NULL ) || ( p->GetType( ) != VALUE_PTR )) return (void *) 0xFFFFFFFF; return p->GetValue( ); } /** * Create a Content from MIME content typed data * * Thread-safe reference counting is used to allow sharing the data * (typically large) across multiple clones while minimizing memory * use. The passed Destroy( ) function is only called when the * reference count drops to zero. * * @param contentType MIME content type for the data * @param content Data to store * @param contentSizeBytes Size of the data, in bytes * @param Destroy Destructor called to release the data when * no longer needed * @param userData Optional user data pointer passed to destroy */ VXIVALUE_API VXIContent * VXIContentCreate(const VXIchar *contentType, VXIbyte *content, VXIulong contentSizeBytes, void (*Destroy)(VXIbyte **content, void *userData), void *userData) { if (( ! contentType ) || ( ! contentType[0] ) || ( ! content ) || ( contentSizeBytes < 1 ) || ( ! Destroy )) return NULL; VXIContent *c = new VXIContent (contentType, content, contentSizeBytes, Destroy, userData); if (( c ) && ( c->GetContent( ) == NULL )) { delete c; c = NULL; } return c; } /** * Content destructor * * @param c Content to destroy */ VXIVALUE_API void VXIContentDestroy(VXIContent **c) { if (( c != NULL ) && ( *c != NULL ) && ( (*c)->GetType( ) == VALUE_CONTENT )) { delete *c; *c = NULL; } } /** * Get the value of a Content * * @param c Content to retrieve the data from * @param contentType Returns the MIME content type for the data * @param content Returns the pointer to the data * @param contentSizeBytes Returns the size of the data, in bytes * @return VXIvalue_RESULT_SUCCESS on success */ VXIVALUE_API VXIvalueResult VXIContentValue(const VXIContent *c, const VXIchar **contentType, const VXIbyte **content, VXIulong *contentSizeBytes) { if (( c == NULL ) || ( c->GetType( ) != VALUE_CONTENT ) || ( ! contentType ) || ( ! content ) || ( ! contentSizeBytes )) { if ( contentType ) *contentType = NULL; if ( content ) *content = NULL; if ( contentSizeBytes ) *contentSizeBytes = 0; return VXIvalue_RESULT_INVALID_ARGUMENT; } *contentType = c->GetContentType( ); *content = c->GetContent( ); *contentSizeBytes = c->GetContentSizeBytes( ); return VXIvalue_RESULT_SUCCESS; } // VXIContentData constructor VXIContentData::VXIContentData (const VXIchar *ct, VXIbyte *c, VXIulong csb, void (*D)(VXIbyte **content, void *ud), void *ud) : refCount(1), contentType(NULL), content(c), contentSizeBytes(csb), Destroy(D), userData(ud) #ifndef WIN32 , mutex(NULL) #endif { if (( ct ) && ( *ct )) { contentType = new VXIchar [wcslen (ct) + 1]; if ( contentType ) wcscpy (contentType, ct); } if ( ! contentType ) content = NULL; // Flag for failure #ifndef WIN32 if (( content ) && ( VXItrdMutexCreate (&mutex) != VXItrd_RESULT_SUCCESS )) content = NULL; #endif } // VXIContentData destructor VXIContentData::~VXIContentData( ) { if ( contentType ) delete [] contentType; if ( content ) (*Destroy)(&content, userData); #ifndef WIN32 if ( mutex ) VXItrdMutexDestroy (&mutex); #endif } // VXIContentData add reference void VXIContentData::AddRef (VXIContentData *data) { if ( data ) { #ifdef WIN32 InterlockedIncrement (&(data->refCount)); #else if ( VXItrdMutexLock (data->mutex) == VXItrd_RESULT_SUCCESS ) { data->refCount++; VXItrdMutexUnlock (data->mutex); } #endif } } // VXIContentData release reference void VXIContentData::Release (VXIContentData **data) { if (( data ) && ( *data )) { #ifdef WIN32 if ( InterlockedDecrement (&((*data)->refCount)) == 0L ) delete *data; #else if ( VXItrdMutexLock ((*data)->mutex) == VXItrd_RESULT_SUCCESS ) { (*data)->refCount--; VXIulong refCount = (*data)->refCount; VXItrdMutexUnlock ((*data)->mutex); if ( refCount == 0 ) delete *data; } #endif *data = NULL; } }
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -