os/ossrv/genericopenlibs/cppstdlib/stl/test/eh/TestClass.h
author sl
Tue, 10 Jun 2014 14:32:02 +0200
changeset 1 260cb5ec6c19
permissions -rw-r--r--
Update contrib.
     1 /***********************************************************************************
     2   TestClass.h
     3 
     4  * Copyright (c) 1997-1998
     5  * Mark of the Unicorn, Inc.
     6  *
     7  * Permission to use, copy, modify, distribute and sell this software
     8  * and its documentation for any purpose is hereby granted without fee,
     9  * provided that the above copyright notice appear in all copies and
    10  * that both that copyright notice and this permission notice appear
    11  * in supporting documentation.  Mark of the Unicorn makes no
    12  * representations about the suitability of this software for any
    13  * purpose.  It is provided "as is" without express or implied warranty.
    14 
    15     SUMMARY: TestClass simulates a class that uses resources. It is designed to
    16       cause exceptions when it is constructed or copied.
    17 
    18 ***********************************************************************************/
    19 #ifndef INCLUDED_MOTU_TestClass
    20 #define INCLUDED_MOTU_TestClass 1
    21 
    22 # include "Prefix.h"
    23 
    24 #  include <functional>
    25 #  include <utility>
    26 #  include <climits>
    27 
    28 #include <iosfwd>
    29 #include "random_number.h"
    30 #include "nc_alloc.h"
    31 
    32 class TestClass
    33 {
    34 public:
    35     inline TestClass();
    36     inline TestClass( int value );
    37     inline TestClass( const TestClass& rhs );
    38     inline ~TestClass();
    39 
    40     inline TestClass& operator=( const TestClass& rhs );
    41     inline int value() const;
    42 
    43     inline TestClass operator!() const;
    44 
    45     bool operator==( const TestClass& rhs ) const
    46     {
    47       return value() == rhs.value();
    48     }
    49 
    50     bool operator<( const TestClass& rhs ) const {
    51       return value() < rhs.value();
    52     }
    53 
    54 protected:
    55     static inline unsigned int get_random(unsigned range = UINT_MAX);
    56 private:
    57   inline void Init( int value );
    58 
    59 #if TESTCLASS_DEEP_DATA
    60     int *p;
    61 #else
    62   int v;
    63 #endif
    64 };
    65 
    66 #if defined( __MWERKS__ ) && __MWERKS__ <= 0x3000 && !__SGI_STL
    67 # if defined( __MSL__ ) && __MSL__ < 0x2406
    68 #  include <iterator.h>
    69 __MSL_FIX_ITERATORS__(TestClass);
    70 __MSL_FIX_ITERATORS__(const TestClass);
    71 typedef EH_STD::pair<const TestClass, TestClass> pair_testclass_testclass;
    72 __MSL_FIX_ITERATORS__( pair_testclass_testclass );
    73 __MSL_FIX_ITERATORS__( const pair_testclass_testclass );
    74 # endif
    75 #endif
    76 
    77 inline void TestClass::Init( int value )
    78 {
    79 #if TESTCLASS_DEEP_DATA
    80   p = new int( value );
    81 #else
    82   simulate_constructor();
    83   v = value;
    84 #endif
    85 }
    86 
    87 inline TestClass::TestClass()
    88 {
    89   Init( int(get_random()) );
    90 }
    91 
    92 inline TestClass::TestClass( int value )
    93 {
    94   Init( value );
    95 }
    96 
    97 inline TestClass::TestClass( const TestClass& rhs )
    98 {
    99   Init( rhs.value() );
   100 }
   101 
   102 inline TestClass::~TestClass()
   103 {
   104 #if TESTCLASS_DEEP_DATA
   105   delete p;
   106 #else
   107   simulate_destructor();
   108 #endif
   109 }
   110 
   111 inline TestClass& TestClass::operator=( const TestClass& rhs )
   112 {
   113 #if TESTCLASS_DEEP_DATA
   114   int *newP = new int( rhs.value() );
   115   delete p;
   116   p = newP;
   117 #else
   118   simulate_possible_failure();
   119     v = rhs.value();
   120 #endif
   121     return *this;
   122 }
   123 
   124 inline int TestClass::value() const
   125 {
   126 #if TESTCLASS_DEEP_DATA
   127   return *p;
   128 #else
   129   return v;
   130 #endif
   131 }
   132 
   133 inline TestClass TestClass::operator!() const
   134 {
   135     return TestClass( value()+1 );
   136 }
   137 
   138 inline bool operator>( const TestClass& lhs, const TestClass& rhs ) {
   139     return rhs < lhs;
   140 }
   141 
   142 inline bool operator>=( const TestClass& lhs, const TestClass& rhs ) {
   143     return !(lhs < rhs);
   144 }
   145 
   146 inline bool operator<=( const TestClass& lhs, const TestClass& rhs ) {
   147     return !(rhs < lhs);
   148 }
   149 
   150 inline bool operator != ( const TestClass& lhs, const TestClass& rhs ) {
   151     return lhs.value() != rhs.value();
   152 }
   153 
   154 inline unsigned int TestClass::get_random( unsigned range )
   155 {
   156     return random_number( range );
   157 }
   158 
   159 extern std::ostream& operator << ( std::ostream& s, const TestClass&);
   160 
   161 #endif // INCLUDED_MOTU_TestClass