sl@0: /************************************************************************ sl@0: * sl@0: * any.cpp - definitions of the rw_any_t class members sl@0: * sl@0: * $Id: any.cpp 345524 2005-11-18 17:08:11Z sebor $ sl@0: * sl@0: ************************************************************************ sl@0: * sl@0: * Copyright (c) 1994-2005 Quovadx, Inc., acting through its Rogue Wave sl@0: * Software division. Licensed under the Apache License, Version 2.0 (the sl@0: * "License"); you may not use this file except in compliance with the sl@0: * License. You may obtain a copy of the License at sl@0: * http://www.apache.org/licenses/LICENSE-2.0. Unless required by sl@0: * applicable law or agreed to in writing, software distributed under sl@0: * the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR sl@0: * CONDITIONS OF ANY KIND, either express or implied. See the License sl@0: * for the specific language governing permissions and limitations under sl@0: * the License. sl@0: * sl@0: **************************************************************************/ sl@0: sl@0: // expand _TEST_EXPORT macros sl@0: #define _RWSTD_TEST_SRC sl@0: sl@0: #include sl@0: sl@0: #include // for rw_sprintfa() sl@0: #include // for free() sl@0: #include // for memset() sl@0: sl@0: sl@0: #ifndef _RWSTD_NO_BOOL sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (bool value) sl@0: : str_ (0), tid_ (t_bool) sl@0: { sl@0: // using memset instead of default-initialization in the ctor sl@0: // initializer list here and in all other ctors to work around sl@0: // a SunPro -xarch=v9 bug (PR #28328) that causes the following: sl@0: // Warning (Anachronism): Assigning int to __BIT_BLAST_16_16. sl@0: // Error: Cannot cast from int to __BIT_BLAST_16_16 sl@0: sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.bool_ = value; sl@0: } sl@0: sl@0: #endif // _RWSTD_NO_BOOL sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (char value) sl@0: : str_ (0), tid_ (t_char) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.char_ = value; sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (signed char value) sl@0: : str_ (0), tid_ (t_schar) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.schar_ = value; sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (unsigned char value) sl@0: : str_ (0), tid_ (t_uchar) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.uchar_ = value; sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (signed short value) sl@0: : str_ (0), tid_ (t_sshrt) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.sshrt_ = value; sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (unsigned short value) sl@0: : str_ (0), tid_ (t_ushrt) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.ushrt_ = value; sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (signed int value) sl@0: : str_ (0), tid_ (t_sint) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.sint_ = value; sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (unsigned int value) sl@0: : str_ (0), tid_ (t_uint) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.uint_ = value; sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (signed long value) sl@0: : str_ (0), tid_ (t_slong) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.slong_ = value; sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (unsigned long value) sl@0: : str_ (0), tid_ (t_ulong) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.ulong_ = value; sl@0: } sl@0: sl@0: sl@0: #ifdef _RWSTD_LONG_LONG sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (signed _RWSTD_LONG_LONG value) sl@0: : str_ (0), tid_ (t_sllong) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.sllong_ = value; sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (unsigned _RWSTD_LONG_LONG value) sl@0: : str_ (0), tid_ (t_ullong) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.ullong_ = value; sl@0: } sl@0: sl@0: #endif // _RWSTD_LONG_LONG sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (float value) sl@0: : str_ (0), tid_ (t_flt) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.flt_ = value; sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (double value) sl@0: : str_ (0), tid_ (t_dbl) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.dbl_ = value; sl@0: } sl@0: sl@0: sl@0: #ifndef _RWSTD_NO_LONG_DOUBLE sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (long double value) sl@0: : str_ (0), tid_ (t_ldbl) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.ldbl_ = value; sl@0: } sl@0: sl@0: #endif // _RWSTD_NO_LONG_DOUBLE sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (const void* value) sl@0: : str_ (0), tid_ (t_pvoid) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.pvoid_ = value; sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (const char* value) sl@0: : str_ (0), tid_ (t_str) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.pvoid_ = value; sl@0: } sl@0: sl@0: sl@0: #ifndef _RWSTD_NO_NATIVE_WCHAR_T sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (wchar_t value) sl@0: : str_ (0), tid_ (t_wchar) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.wchar_ = value; sl@0: } sl@0: sl@0: #endif // _RWSTD_NO_NATIVE_WCHAR_T sl@0: sl@0: sl@0: #ifndef _RWSTD_NO_WCHAR_T sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (const wchar_t* value) sl@0: : str_ (0), tid_ (t_wstr) sl@0: { sl@0: memset (&val_, 0, sizeof val_); sl@0: val_.pvoid_ = value; sl@0: } sl@0: sl@0: #endif // _RWSTD_NO_WCHAR_T sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::rw_any_t (const rw_any_t &rhs) sl@0: : val_ (rhs.val_), str_ (0), tid_ (rhs.tid_) sl@0: { sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t& rw_any_t::operator= (const rw_any_t &rhs) sl@0: { sl@0: // free string allocated by tostr() (via a call to sprintfa()) sl@0: free (str_); sl@0: sl@0: val_ = rhs.val_; sl@0: str_ = 0; sl@0: tid_ = rhs.tid_; sl@0: sl@0: return *this; sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT rw_any_t::~rw_any_t () sl@0: { sl@0: // free string allocated by tostr() (via a call to sprintfa()) sl@0: free (str_); sl@0: sl@0: memset (&val_, 0, sizeof val_); sl@0: sl@0: str_ = 0; sl@0: tid_ = type_id_t (); sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT const char* sl@0: rw_any_t::type_name () const sl@0: { sl@0: static const char* const names[] = { sl@0: "", sl@0: "bool", "signed char", "unsigned char", "char", sl@0: "short", "unsigned short", "int", "unsigned int", sl@0: "long", "unsigned long", sl@0: "long long", "unsigned long long", sl@0: "float", "double", "long double", sl@0: "wchar_t", "void*", sl@0: "const char*", "const wchar_t*" sl@0: }; sl@0: sl@0: // the liftime of the returned string must extend sl@0: // to the end of the program sl@0: return names [tid_]; sl@0: } sl@0: sl@0: sl@0: _TEST_EXPORT const char* sl@0: rw_any_t::tostr (const char *fmt /* = 0 */) sl@0: { sl@0: // free the previously allocated string sl@0: free (str_); sl@0: str_ = 0; sl@0: sl@0: switch (tid_) { sl@0: case t_none: sl@0: return 0; sl@0: sl@0: case t_bool: sl@0: return val_.bool_ ? "true" : "false"; sl@0: sl@0: case t_char: sl@0: if (0 == fmt) sl@0: fmt = "%c"; sl@0: str_ = rw_sprintfa (fmt, val_.char_); sl@0: break; sl@0: sl@0: case t_schar: sl@0: if (0 == fmt) sl@0: fmt = "%hhi"; sl@0: str_ = rw_sprintfa (fmt, val_.schar_); sl@0: break; sl@0: sl@0: case t_uchar: sl@0: if (0 == fmt) sl@0: fmt = "%hhu"; sl@0: str_ = rw_sprintfa (fmt, val_.uchar_); sl@0: break; sl@0: sl@0: case t_sshrt: sl@0: if (0 == fmt) sl@0: fmt = "%hi"; sl@0: str_ = rw_sprintfa (fmt, val_.sshrt_); sl@0: break; sl@0: sl@0: case t_ushrt: sl@0: if (0 == fmt) sl@0: fmt = "%hu"; sl@0: str_ = rw_sprintfa (fmt, val_.ushrt_); sl@0: break; sl@0: sl@0: case t_sint: sl@0: if (0 == fmt) sl@0: fmt = "%i"; sl@0: str_ = rw_sprintfa (fmt, val_.sint_); sl@0: break; sl@0: sl@0: case t_uint: sl@0: if (0 == fmt) sl@0: fmt = "%u"; sl@0: str_ = rw_sprintfa (fmt, val_.uint_); sl@0: break; sl@0: sl@0: case t_slong: sl@0: if (0 == fmt) sl@0: fmt = "%li"; sl@0: str_ = rw_sprintfa (fmt, val_.slong_); sl@0: break; sl@0: sl@0: case t_ulong: sl@0: if (0 == fmt) sl@0: fmt = "%lu"; sl@0: str_ = rw_sprintfa (fmt, val_.ulong_); sl@0: break; sl@0: sl@0: #ifdef _RWSTD_LONG_LONG sl@0: sl@0: case t_sllong: sl@0: if (0 == fmt) sl@0: fmt = "%lli"; sl@0: str_ = rw_sprintfa (fmt, val_.sllong_); sl@0: break; sl@0: sl@0: case t_ullong: sl@0: if (0 == fmt) sl@0: fmt = "%llu"; sl@0: str_ = rw_sprintfa (fmt, val_.ullong_); sl@0: break; sl@0: sl@0: #endif // _RWSTD_LONG_LONG sl@0: sl@0: case t_flt: sl@0: if (0 == fmt) sl@0: fmt = "%g"; sl@0: str_ = rw_sprintfa (fmt, val_.flt_); sl@0: break; sl@0: sl@0: case t_dbl: sl@0: if (0 == fmt) sl@0: fmt = "%g"; sl@0: str_ = rw_sprintfa (fmt, val_.dbl_); sl@0: break; sl@0: sl@0: #ifndef _RWSTD_NO_LONG_DOUBLE sl@0: sl@0: case t_ldbl: sl@0: if (0 == fmt) sl@0: fmt = "%Lg"; sl@0: str_ = rw_sprintfa (fmt, val_.ldbl_); sl@0: break; sl@0: sl@0: #endif // _RWSTD_NO_LONG_DOUBLE sl@0: sl@0: case t_pvoid: sl@0: if (0 == fmt) sl@0: fmt = "%p"; sl@0: str_ = rw_sprintfa (fmt, val_.pvoid_); sl@0: break; sl@0: sl@0: #ifndef _RWSTD_NO_NATIVE_WCHAR_T sl@0: sl@0: case t_wchar: sl@0: if (0 == fmt) sl@0: fmt = "%lc"; sl@0: str_ = rw_sprintfa (fmt, val_.wchar_); sl@0: break; sl@0: sl@0: #endif // _RWSTD_NO_NATIVE_WCHAR_T sl@0: sl@0: case t_str: sl@0: if (0 == fmt) sl@0: fmt = "%s"; sl@0: str_ = rw_sprintfa (fmt, val_.pvoid_); sl@0: break; sl@0: sl@0: #ifndef _RWSTD_NO_WCHAR_T sl@0: sl@0: case t_wstr: sl@0: if (0 == fmt) sl@0: fmt = "%ls"; sl@0: str_ = rw_sprintfa (fmt, val_.pvoid_); sl@0: break; sl@0: sl@0: #endif // _RWSTD_NO_WCHAR_T sl@0: sl@0: } sl@0: sl@0: return str_; sl@0: }