os/ossrv/stdcpp/tsrc/Stdcpp_test/stdcxx/testengine/src/any.cpp
author sl@SLION-WIN7.fritz.box
Fri, 15 Jun 2012 03:10:57 +0200
changeset 0 bde4ae8d615e
permissions -rw-r--r--
First public contribution.
sl@0
     1
 /************************************************************************
sl@0
     2
 *
sl@0
     3
 * any.cpp - definitions of the rw_any_t class members
sl@0
     4
 *
sl@0
     5
 * $Id: any.cpp 345524 2005-11-18 17:08:11Z sebor $
sl@0
     6
 *
sl@0
     7
 ************************************************************************
sl@0
     8
 *
sl@0
     9
 * Copyright (c) 1994-2005 Quovadx,  Inc., acting through its  Rogue Wave
sl@0
    10
 * Software division. Licensed under the Apache License, Version 2.0 (the
sl@0
    11
 * "License");  you may  not use this file except  in compliance with the
sl@0
    12
 * License.    You    may   obtain   a   copy   of    the   License    at
sl@0
    13
 * http://www.apache.org/licenses/LICENSE-2.0.    Unless   required    by
sl@0
    14
 * applicable law  or agreed to  in writing,  software  distributed under
sl@0
    15
 * the License is distributed on an "AS IS" BASIS,  WITHOUT WARRANTIES OR
sl@0
    16
 * CONDITIONS OF  ANY KIND, either  express or implied.  See  the License
sl@0
    17
 * for the specific language governing permissions  and limitations under
sl@0
    18
 * the License.
sl@0
    19
 *
sl@0
    20
 **************************************************************************/
sl@0
    21
sl@0
    22
// expand _TEST_EXPORT macros
sl@0
    23
#define _RWSTD_TEST_SRC
sl@0
    24
sl@0
    25
#include <any.h>
sl@0
    26
sl@0
    27
#include <printf.h>   // for rw_sprintfa()
sl@0
    28
#include <stdlib.h>   // for free()
sl@0
    29
#include <string.h>   // for memset()
sl@0
    30
sl@0
    31
sl@0
    32
#ifndef _RWSTD_NO_BOOL
sl@0
    33
sl@0
    34
_TEST_EXPORT rw_any_t::rw_any_t (bool value)
sl@0
    35
    : str_ (0), tid_ (t_bool)
sl@0
    36
{
sl@0
    37
    // using memset instead of default-initialization in the ctor
sl@0
    38
    // initializer list here and in all other ctors to work around
sl@0
    39
    // a SunPro -xarch=v9 bug (PR #28328) that causes the following:
sl@0
    40
    // Warning (Anachronism): Assigning int to __BIT_BLAST_16_16.
sl@0
    41
    // Error: Cannot cast from int to __BIT_BLAST_16_16
sl@0
    42
    
sl@0
    43
    memset (&val_, 0, sizeof val_);
sl@0
    44
    val_.bool_ = value;
sl@0
    45
}
sl@0
    46
sl@0
    47
#endif   // _RWSTD_NO_BOOL
sl@0
    48
sl@0
    49
_TEST_EXPORT rw_any_t::rw_any_t (char value)
sl@0
    50
    : str_ (0), tid_ (t_char)
sl@0
    51
{
sl@0
    52
    memset (&val_, 0, sizeof val_);
sl@0
    53
    val_.char_ = value;
sl@0
    54
}
sl@0
    55
sl@0
    56
sl@0
    57
_TEST_EXPORT rw_any_t::rw_any_t (signed char value)
sl@0
    58
    : str_ (0), tid_ (t_schar)
sl@0
    59
{
sl@0
    60
    memset (&val_, 0, sizeof val_);
sl@0
    61
    val_.schar_ = value;
sl@0
    62
}
sl@0
    63
sl@0
    64
sl@0
    65
_TEST_EXPORT rw_any_t::rw_any_t (unsigned char value)
sl@0
    66
    : str_ (0), tid_ (t_uchar)
sl@0
    67
{
sl@0
    68
    memset (&val_, 0, sizeof val_);
sl@0
    69
    val_.uchar_ = value;
sl@0
    70
}
sl@0
    71
sl@0
    72
sl@0
    73
_TEST_EXPORT rw_any_t::rw_any_t (signed short value)
sl@0
    74
    : str_ (0), tid_ (t_sshrt)
sl@0
    75
{
sl@0
    76
    memset (&val_, 0, sizeof val_);
sl@0
    77
    val_.sshrt_ = value;
sl@0
    78
}
sl@0
    79
sl@0
    80
sl@0
    81
_TEST_EXPORT rw_any_t::rw_any_t (unsigned short value)
sl@0
    82
    : str_ (0), tid_ (t_ushrt)
sl@0
    83
{
sl@0
    84
    memset (&val_, 0, sizeof val_);
sl@0
    85
    val_.ushrt_ = value;
sl@0
    86
}
sl@0
    87
sl@0
    88
sl@0
    89
_TEST_EXPORT rw_any_t::rw_any_t (signed int value)
sl@0
    90
    : str_ (0), tid_ (t_sint)
sl@0
    91
{
sl@0
    92
    memset (&val_, 0, sizeof val_);
sl@0
    93
    val_.sint_ = value;
sl@0
    94
}
sl@0
    95
sl@0
    96
sl@0
    97
_TEST_EXPORT rw_any_t::rw_any_t (unsigned int value)
sl@0
    98
    : str_ (0), tid_ (t_uint)
sl@0
    99
{
sl@0
   100
    memset (&val_, 0, sizeof val_);
sl@0
   101
    val_.uint_ = value;
sl@0
   102
}
sl@0
   103
sl@0
   104
sl@0
   105
_TEST_EXPORT rw_any_t::rw_any_t (signed long value)
sl@0
   106
    : str_ (0), tid_ (t_slong)
sl@0
   107
{
sl@0
   108
    memset (&val_, 0, sizeof val_);
sl@0
   109
    val_.slong_ = value;
sl@0
   110
}
sl@0
   111
sl@0
   112
sl@0
   113
_TEST_EXPORT rw_any_t::rw_any_t (unsigned long value)
sl@0
   114
    : str_ (0), tid_ (t_ulong)
sl@0
   115
{
sl@0
   116
    memset (&val_, 0, sizeof val_);
sl@0
   117
    val_.ulong_ = value;
sl@0
   118
}
sl@0
   119
sl@0
   120
sl@0
   121
#ifdef _RWSTD_LONG_LONG
sl@0
   122
sl@0
   123
_TEST_EXPORT rw_any_t::rw_any_t (signed _RWSTD_LONG_LONG value)
sl@0
   124
    : str_ (0), tid_ (t_sllong)
sl@0
   125
{
sl@0
   126
    memset (&val_, 0, sizeof val_);
sl@0
   127
    val_.sllong_ = value;
sl@0
   128
}
sl@0
   129
sl@0
   130
sl@0
   131
_TEST_EXPORT rw_any_t::rw_any_t (unsigned _RWSTD_LONG_LONG value)
sl@0
   132
    : str_ (0), tid_ (t_ullong)
sl@0
   133
{
sl@0
   134
    memset (&val_, 0, sizeof val_);
sl@0
   135
    val_.ullong_ = value;
sl@0
   136
}
sl@0
   137
sl@0
   138
#endif   // _RWSTD_LONG_LONG
sl@0
   139
sl@0
   140
sl@0
   141
_TEST_EXPORT rw_any_t::rw_any_t (float value)
sl@0
   142
    : str_ (0), tid_ (t_flt)
sl@0
   143
{
sl@0
   144
    memset (&val_, 0, sizeof val_);
sl@0
   145
    val_.flt_ = value;
sl@0
   146
}
sl@0
   147
sl@0
   148
sl@0
   149
_TEST_EXPORT rw_any_t::rw_any_t (double value)
sl@0
   150
    : str_ (0), tid_ (t_dbl)
sl@0
   151
{
sl@0
   152
    memset (&val_, 0, sizeof val_);
sl@0
   153
    val_.dbl_ = value;
sl@0
   154
}
sl@0
   155
sl@0
   156
sl@0
   157
#ifndef _RWSTD_NO_LONG_DOUBLE
sl@0
   158
sl@0
   159
_TEST_EXPORT rw_any_t::rw_any_t (long double value)
sl@0
   160
    : str_ (0), tid_ (t_ldbl)
sl@0
   161
{
sl@0
   162
    memset (&val_, 0, sizeof val_);
sl@0
   163
    val_.ldbl_ = value;
sl@0
   164
}
sl@0
   165
sl@0
   166
#endif   // _RWSTD_NO_LONG_DOUBLE
sl@0
   167
sl@0
   168
sl@0
   169
_TEST_EXPORT rw_any_t::rw_any_t (const void* value)
sl@0
   170
    : str_ (0), tid_ (t_pvoid)
sl@0
   171
{
sl@0
   172
    memset (&val_, 0, sizeof val_);
sl@0
   173
    val_.pvoid_ = value;
sl@0
   174
}
sl@0
   175
sl@0
   176
sl@0
   177
_TEST_EXPORT rw_any_t::rw_any_t (const char* value)
sl@0
   178
    : str_ (0), tid_ (t_str)
sl@0
   179
{
sl@0
   180
    memset (&val_, 0, sizeof val_);
sl@0
   181
    val_.pvoid_ = value;
sl@0
   182
}
sl@0
   183
sl@0
   184
sl@0
   185
#ifndef _RWSTD_NO_NATIVE_WCHAR_T
sl@0
   186
sl@0
   187
_TEST_EXPORT rw_any_t::rw_any_t (wchar_t value)
sl@0
   188
    : str_ (0), tid_ (t_wchar)
sl@0
   189
{
sl@0
   190
    memset (&val_, 0, sizeof val_);
sl@0
   191
    val_.wchar_ = value;
sl@0
   192
}
sl@0
   193
sl@0
   194
#endif   // _RWSTD_NO_NATIVE_WCHAR_T
sl@0
   195
sl@0
   196
sl@0
   197
#ifndef _RWSTD_NO_WCHAR_T
sl@0
   198
sl@0
   199
_TEST_EXPORT rw_any_t::rw_any_t (const wchar_t* value)
sl@0
   200
    : str_ (0), tid_ (t_wstr)
sl@0
   201
{
sl@0
   202
    memset (&val_, 0, sizeof val_);
sl@0
   203
    val_.pvoid_ = value;
sl@0
   204
}
sl@0
   205
sl@0
   206
#endif   // _RWSTD_NO_WCHAR_T
sl@0
   207
sl@0
   208
sl@0
   209
_TEST_EXPORT rw_any_t::rw_any_t (const rw_any_t &rhs)
sl@0
   210
    : val_ (rhs.val_), str_ (0), tid_ (rhs.tid_)
sl@0
   211
{
sl@0
   212
}
sl@0
   213
sl@0
   214
sl@0
   215
_TEST_EXPORT rw_any_t& rw_any_t::operator= (const rw_any_t &rhs)
sl@0
   216
{
sl@0
   217
    // free string allocated by tostr() (via a call to sprintfa())
sl@0
   218
    free (str_);
sl@0
   219
sl@0
   220
    val_ = rhs.val_;
sl@0
   221
    str_ = 0;
sl@0
   222
    tid_ = rhs.tid_;
sl@0
   223
sl@0
   224
    return *this;
sl@0
   225
}
sl@0
   226
sl@0
   227
sl@0
   228
_TEST_EXPORT rw_any_t::~rw_any_t ()
sl@0
   229
{
sl@0
   230
    // free string allocated by tostr() (via a call to sprintfa())
sl@0
   231
    free (str_);
sl@0
   232
sl@0
   233
    memset (&val_, 0, sizeof val_);
sl@0
   234
sl@0
   235
    str_ = 0;
sl@0
   236
    tid_ = type_id_t ();
sl@0
   237
}
sl@0
   238
sl@0
   239
sl@0
   240
_TEST_EXPORT const char*
sl@0
   241
rw_any_t::type_name () const
sl@0
   242
{
sl@0
   243
    static const char* const names[] = {
sl@0
   244
        "<no type>",
sl@0
   245
        "bool", "signed char", "unsigned char", "char",
sl@0
   246
        "short", "unsigned short", "int", "unsigned int",
sl@0
   247
        "long", "unsigned long",
sl@0
   248
        "long long", "unsigned long long",
sl@0
   249
        "float", "double", "long double",
sl@0
   250
        "wchar_t", "void*",
sl@0
   251
        "const char*", "const wchar_t*"
sl@0
   252
    };
sl@0
   253
sl@0
   254
    // the liftime of the returned string must extend
sl@0
   255
    // to the end of the program
sl@0
   256
    return names [tid_];
sl@0
   257
}
sl@0
   258
sl@0
   259
sl@0
   260
_TEST_EXPORT const char*
sl@0
   261
rw_any_t::tostr (const char *fmt /* = 0 */)
sl@0
   262
{
sl@0
   263
    // free the previously allocated string
sl@0
   264
    free (str_);
sl@0
   265
    str_ = 0;
sl@0
   266
sl@0
   267
    switch (tid_) {
sl@0
   268
    case t_none:
sl@0
   269
        return 0;
sl@0
   270
sl@0
   271
    case t_bool:
sl@0
   272
        return val_.bool_ ? "true" : "false";
sl@0
   273
sl@0
   274
    case t_char:
sl@0
   275
        if (0 == fmt)
sl@0
   276
            fmt = "%c";
sl@0
   277
        str_ = rw_sprintfa (fmt, val_.char_);
sl@0
   278
        break;
sl@0
   279
sl@0
   280
    case t_schar:
sl@0
   281
        if (0 == fmt)
sl@0
   282
            fmt = "%hhi";
sl@0
   283
        str_ = rw_sprintfa (fmt, val_.schar_);
sl@0
   284
        break;
sl@0
   285
sl@0
   286
    case t_uchar:
sl@0
   287
        if (0 == fmt)
sl@0
   288
            fmt = "%hhu";
sl@0
   289
        str_ = rw_sprintfa (fmt, val_.uchar_);
sl@0
   290
        break;
sl@0
   291
sl@0
   292
    case t_sshrt:
sl@0
   293
        if (0 == fmt)
sl@0
   294
            fmt = "%hi";
sl@0
   295
        str_ = rw_sprintfa (fmt, val_.sshrt_);
sl@0
   296
        break;
sl@0
   297
sl@0
   298
    case t_ushrt:
sl@0
   299
        if (0 == fmt)
sl@0
   300
            fmt = "%hu";
sl@0
   301
        str_ = rw_sprintfa (fmt, val_.ushrt_);
sl@0
   302
        break;
sl@0
   303
sl@0
   304
    case t_sint:
sl@0
   305
        if (0 == fmt)
sl@0
   306
            fmt = "%i";
sl@0
   307
        str_ = rw_sprintfa (fmt, val_.sint_);
sl@0
   308
        break;
sl@0
   309
sl@0
   310
    case t_uint:
sl@0
   311
        if (0 == fmt)
sl@0
   312
            fmt = "%u";
sl@0
   313
        str_ = rw_sprintfa (fmt, val_.uint_);
sl@0
   314
        break;
sl@0
   315
sl@0
   316
    case t_slong:
sl@0
   317
        if (0 == fmt)
sl@0
   318
            fmt = "%li";
sl@0
   319
        str_ = rw_sprintfa (fmt, val_.slong_);
sl@0
   320
        break;
sl@0
   321
sl@0
   322
    case t_ulong:
sl@0
   323
        if (0 == fmt)
sl@0
   324
            fmt = "%lu";
sl@0
   325
        str_ = rw_sprintfa (fmt, val_.ulong_);
sl@0
   326
        break;
sl@0
   327
sl@0
   328
#ifdef _RWSTD_LONG_LONG
sl@0
   329
sl@0
   330
    case t_sllong:
sl@0
   331
        if (0 == fmt)
sl@0
   332
            fmt = "%lli";
sl@0
   333
        str_ = rw_sprintfa (fmt, val_.sllong_);
sl@0
   334
        break;
sl@0
   335
sl@0
   336
    case t_ullong:
sl@0
   337
        if (0 == fmt)
sl@0
   338
            fmt = "%llu";
sl@0
   339
        str_ = rw_sprintfa (fmt, val_.ullong_);
sl@0
   340
        break;
sl@0
   341
sl@0
   342
#endif   // _RWSTD_LONG_LONG
sl@0
   343
sl@0
   344
    case t_flt:
sl@0
   345
        if (0 == fmt)
sl@0
   346
            fmt = "%g";
sl@0
   347
        str_ = rw_sprintfa (fmt, val_.flt_);
sl@0
   348
        break;
sl@0
   349
sl@0
   350
    case t_dbl:
sl@0
   351
        if (0 == fmt)
sl@0
   352
            fmt = "%g";
sl@0
   353
        str_ = rw_sprintfa (fmt, val_.dbl_);
sl@0
   354
        break;
sl@0
   355
sl@0
   356
#ifndef _RWSTD_NO_LONG_DOUBLE
sl@0
   357
sl@0
   358
    case t_ldbl:
sl@0
   359
        if (0 == fmt)
sl@0
   360
            fmt = "%Lg";
sl@0
   361
        str_ = rw_sprintfa (fmt, val_.ldbl_);
sl@0
   362
        break;
sl@0
   363
sl@0
   364
#endif   // _RWSTD_NO_LONG_DOUBLE
sl@0
   365
sl@0
   366
    case t_pvoid:
sl@0
   367
        if (0 == fmt)
sl@0
   368
            fmt = "%p";
sl@0
   369
        str_ = rw_sprintfa (fmt, val_.pvoid_);
sl@0
   370
        break;
sl@0
   371
sl@0
   372
#ifndef _RWSTD_NO_NATIVE_WCHAR_T
sl@0
   373
sl@0
   374
    case t_wchar:
sl@0
   375
        if (0 == fmt)
sl@0
   376
            fmt = "%lc";
sl@0
   377
        str_ = rw_sprintfa (fmt, val_.wchar_);
sl@0
   378
        break;
sl@0
   379
sl@0
   380
#endif   // _RWSTD_NO_NATIVE_WCHAR_T
sl@0
   381
sl@0
   382
    case t_str:
sl@0
   383
        if (0 == fmt)
sl@0
   384
            fmt = "%s";
sl@0
   385
        str_ = rw_sprintfa (fmt, val_.pvoid_);
sl@0
   386
        break;
sl@0
   387
sl@0
   388
#ifndef _RWSTD_NO_WCHAR_T
sl@0
   389
sl@0
   390
    case t_wstr:
sl@0
   391
        if (0 == fmt)
sl@0
   392
            fmt = "%ls";
sl@0
   393
        str_ = rw_sprintfa (fmt, val_.pvoid_);
sl@0
   394
        break;
sl@0
   395
sl@0
   396
#endif   // _RWSTD_NO_WCHAR_T
sl@0
   397
sl@0
   398
    }
sl@0
   399
sl@0
   400
    return str_;
sl@0
   401
}