1e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott/***********************************************************************************
2e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  SortClass.h
3e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
4e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Copyright (c) 1997
5e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Mark of the Unicorn, Inc.
6e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott *
7e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * Permission to use, copy, modify, distribute and sell this software
8e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * and its documentation for any purpose is hereby granted without fee,
9e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * provided that the above copyright notice appear in all copies and
10e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * that both that copyright notice and this permission notice appear
11e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * in supporting documentation.  Mark of the Unicorn makes no
12e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * representations about the suitability of this software for any
13e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott * purpose.  It is provided "as is" without express or implied warranty.
14e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
15e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    SUMMARY: A class designed to test operations that compares objects. All
16e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      comparisons on SortClass may fail. Also records its own address for
17e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott      the sake of testing the stability of sorting algorithms.
18e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
19e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott***********************************************************************************/
20e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if ! defined (INCLUDED_MOTU_SortClass)
21e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#define INCLUDED_MOTU_SortClass 1
22e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
23e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include "Prefix.h"
24e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# include "TestClass.h"
25e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
26e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottclass SortClass : public TestClass
27e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott{
28e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottpublic:
29e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  enum { kRange = 100 };
30e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
31e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  SortClass( int v ) : TestClass( v ), addr(0) {
32e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     ResetAddress();
33e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
34e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
35e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  SortClass() : TestClass( (int)get_random(kRange) ), addr(0) {
36e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott     ResetAddress();
37e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
38e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
39e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  bool operator<( const TestClass& rhs ) const
40e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
41e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    simulate_possible_failure();
42e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return (const TestClass&)*this < ( rhs );
43e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
44e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
45e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  bool operator==( const TestClass& rhs ) const
46e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  {
47e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    simulate_possible_failure();
48e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return (const TestClass&)*this == ( rhs );
49e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  }
50e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
51e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  SortClass* GetAddress() const { return addr; }
52e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  void ResetAddress() { addr = this; }
53e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
54e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottprivate:
55e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott  SortClass* addr;
56e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott};
57e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
58e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline bool operator>( const SortClass& lhs, const SortClass& rhs ) {
59e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return rhs < lhs;
60e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
61e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
62e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline bool operator<=( const SortClass& lhs, const SortClass& rhs ) {
63e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return !(rhs < lhs);
64e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
65e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
66e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline bool operator>=( const SortClass& lhs, const SortClass& rhs ) {
67e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return !(lhs < rhs);
68e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
69e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
70e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scottinline bool operator != ( const SortClass& lhs, const SortClass& rhs ) {
71e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott    return !(lhs == rhs);
72e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott}
73e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
74e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#if defined( __MWERKS__ ) && __MWERKS__ <= 0x3000 && !__SGI_STL
75e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# if defined( __MSL__ ) && __MSL__ < 0x2406
76e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__MSL_FIX_ITERATORS__(SortClass);
77e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott__MSL_FIX_ITERATORS__(const SortClass);
78e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott# endif
79e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif
80e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott
81e46c9386c4f79aa40185f79a19fc5b2a7ef528b3Patrick Scott#endif // INCLUDED_MOTU_SortClass
82