2025-12-10 00:01:32 +08:00

259 lines
10 KiB
C++

/****************************************************************************
(c) 2005 by STEMMER IMAGING
// License: This file is published under the license of the EMVA GenICam Standard Group.
// A text file describing the legal terms is included in your installation as 'GenICam_license.pdf'.
// If for some reason you are missing this file please contact the EMVA or visit the website
// (http://www.genicam.org) for a full copy.
//
// THIS SOFTWARE IS PROVIDED BY THE EMVA GENICAM STANDARD GROUP "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
// THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
// PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE EMVA GENICAM STANDARD GROUP
// OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
// EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
// PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
// OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
// WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
// POSSIBILITY OF SUCH DAMAGE.
****************************************************************************/
/// \file
/// \brief Portable string implementation
/// \ingroup Base_PublicUtilities
#ifndef GENICAM_GCSTRING_H
#define GENICAM_GCSTRING_H
#include <new>
#include <string>
#include <iostream>
#include <Base/GCTypes.h>
#pragma pack(push, 8)
/**
\brief Indicates either 'not found' or 'all remaining characters'.
\ingroup GenApi_Implementation
*/
#define GCSTRING_NPOS size_t(-1)
namespace GENICAM_NAMESPACE
{
/**
\brief A string class which is a clone of std::string
\ingroup Base_PublicUtilities
*/
class GCBASE_API gcstring
{
# if defined(_MSC_VER) && !defined(PHARLAP_WIN32)
public:
//! Helper class for storing shared-ownership wchar_t *
class GCBASE_API gcwchar
{
public:
//! Creates a buffer of \a n wchar_ts
explicit gcwchar( size_t n );
// copy constructor
gcwchar( const gcwchar &rhs );
// assignment operator
gcwchar & operator = (const gcwchar &rhs);
//! Gets the c-string.
const wchar_t * c_str() const;
//! Gets the length of the buffer.
size_t length() const;
//! destructor
~gcwchar();
private:
class impl;
impl *m_pimpl;
};
# endif
// Ctor / Dtor
// -------------------------------------------------------------------------
public:
gcstring ();
gcstring ( const char *pc );
gcstring ( const char *pc, size_t n );
gcstring ( size_t count, char ch );
gcstring ( const gcstring &str );
# if defined(_MSC_VER) && !defined(PHARLAP_WIN32)
explicit gcstring ( const wchar_t *pBufferUTF16 );
gcstring ( const wchar_t *pBufferUTF16, size_t n );
# endif
virtual ~gcstring ( void );
// Data access
// -------------------------------------------------------------------------
public:
virtual gcstring & append ( const gcstring &str );
virtual gcstring & append ( size_t count, char ch );
virtual gcstring & assign ( const gcstring &str );
virtual gcstring & assign ( size_t count, char ch );
virtual gcstring & assign ( const char *pc );
virtual gcstring & assign ( const char *pc, size_t n );
# if defined(_MSC_VER) && !defined(PHARLAP_WIN32)
virtual gcstring & assign ( const wchar_t *pStringUTF16 );
virtual gcstring & assign ( const wchar_t *pStringUTF16, int n );
# endif
virtual int compare ( const gcstring &str ) const;
# if defined(_MSC_VER) && !defined(PHARLAP_WIN32)
virtual gcwchar w_str ( void ) const;
# endif
virtual const char *c_str ( void ) const;
virtual bool empty ( void ) const;
virtual size_t find ( char ch, size_t offset = 0 ) const;
virtual size_t find ( const gcstring &str, size_t offset = 0 ) const;
virtual size_t find ( const gcstring &str, size_t offset, size_t count ) const;
virtual size_t find ( const char* pc, size_t offset = 0) const;
virtual size_t find ( const char* pc, size_t offset, size_t count ) const;
virtual size_t length ( void ) const;
virtual size_t size ( void ) const;
virtual void resize ( size_t n );
virtual size_t max_size ( ) const;
virtual gcstring substr ( size_t offset = 0, size_t count = GCSTRING_NPOS ) const;
virtual size_t find_first_of ( const gcstring &str, size_t offset = 0 ) const;
virtual size_t find_first_not_of ( const gcstring &str, size_t offset = 0 ) const;
static size_t _npos ( void );
virtual void swap ( gcstring &Right );
// Operators
// -------------------------------------------------------------------------
public:
bool operator != ( const gcstring &str ) const;
bool operator != ( const char *pc ) const;
gcstring & operator += ( const gcstring &str );
gcstring operator += ( const gcstring &str ) const;
gcstring & operator += ( const char *pc );
gcstring & operator += ( char ch );
gcstring operator += ( char ch ) const;
gcstring & operator = ( const gcstring &str );
# if defined(_MSC_VER) && !defined(PHARLAP_WIN32)
gcstring & operator = ( const wchar_t *pStringUTF16 );
# endif
bool operator == ( const gcstring &str ) const;
bool operator == ( const char *pc ) const;
bool operator < ( const gcstring &str ) const;
bool operator > ( const gcstring &str ) const;
operator const char * ( void ) const;
void operator delete ( void *pWhere );
void operator delete ( void *pWhere, void *pNewWhere );
void * operator new ( size_t uiSize );
void * operator new ( size_t uiSize, void *pWhere );
GCBASE_API
friend gcstring operator + ( const gcstring &left, const gcstring &right );
GCBASE_API
friend gcstring operator + ( const gcstring &left, const char *right );
GCBASE_API
friend gcstring operator + ( const char *left, const gcstring &right );
// Member
// -------------------------------------------------------------------------
private:
// redundant pointer to make the possible to see the contents of the string in the debugger
const char* m_psz;
// actual std::string object
uint8_t m_opaqueData[64];
// Constants
// -------------------------------------------------------------------------
public:
// Beware : this static member prevents delay loading
// use _npos() instead
static const size_t npos;
};
}
namespace GENICAM_NAMESPACE
{
// this is necessary due to the circular dependency between string/exception
GCBASE_API void ThrowBadAlloc(const char *source, int line);
//! STL getline
//! \ingroup Base_PublicUtilities
inline std::istream & getline(std::istream& is, GENICAM_NAMESPACE::gcstring& str)
{
try
{
std::string tmp;
std::getline(is, tmp);
str.assign(tmp.c_str(), tmp.size());
}
catch(std::bad_alloc &)
{
ThrowBadAlloc(__FILE__, __LINE__);
}
return is;
}
//! STL getline
//! \ingroup Base_PublicUtilities
inline std::istream & getline(std::istream& is, GENICAM_NAMESPACE::gcstring& str, char delim)
{
try
{
std::string tmp;
std::getline(is, tmp, delim);
str.assign(tmp.c_str(), tmp.size());
}
catch(std::bad_alloc &)
{
ThrowBadAlloc(__FILE__, __LINE__);
}
return is;
}
}
//! STL operator out
//! \ingroup Base_PublicUtilities
inline std::ostream & operator <<(std::ostream &ostr, const GENICAM_NAMESPACE::gcstring &str)
{
try
{
// use formatted output operator of std::string
ostr << str.c_str();
}
catch(std::bad_alloc &)
{
GENICAM_NAMESPACE::ThrowBadAlloc(__FILE__, __LINE__);
}
return ostr;
}
//! STL operator in
//! \ingroup Base_PublicUtilities
inline std::istream & operator >>(std::istream &istr, GENICAM_NAMESPACE::gcstring &str)
{
try
{
std::string tmp;
istr >> tmp;
str.assign(tmp.c_str(), tmp.size());
}
catch(std::bad_alloc &)
{
GENICAM_NAMESPACE::ThrowBadAlloc(__FILE__, __LINE__);
}
return istr;
}
#pragma pack(pop)
#endif // GENICAM_GCSTRING_H