genericopenlibs/cppstdlib/stl/test/eh/TestClass.h
changeset 31 ce057bb09d0b
parent 0 e4d67989cc36
equal deleted inserted replaced
30:e20de85af2ee 31:ce057bb09d0b
       
     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