Author: elemings
Date: Wed Jul 16 15:49:27 2008
New Revision: 677458

URL: http://svn.apache.org/viewvc?rev=677458&view=rev
Log:
2008-07-16  Eric Lemings <[EMAIL PROTECTED]>

        STDCXX-958
        * include/rw/_tuple.h: Fix move semantics in heterogenous move
        constructor.  (Move assignment operator fixed previously in
        revision 675044.)
        * include/tuple: Removed unnecessary `explicit' keywords.  Fix
        move semantics in value move constructor for pair specialization.
        * tests/utilities/20.tuple.h: Add UserDefined class -- similar
        to UserClass with additional move semantics and implicit
        conversions for tuple testing (and without unused stuff from
        UserClass).
        Add general utilities for tuple names, formatting directives.
        * tests/utilities/20.tuple.cnstr.cpp: Generalize test facility.
        Abstract differences between tuple and element types with
        template function overloads.  Update all tests to utilize new
        UserDefined class and test facility.
        * tests/utilities/20.tuple.creation.cpp: Update tests for new
        UserDefined class.
        * tests/utilities/20.tuple.elem.cpp: Same.
        * tests/utilities/20.tuple.helpers.cpp: Same.
        * tests/utilities/20.tuple.rel.cpp: Same.


Modified:
    stdcxx/branches/4.3.x/include/rw/_tuple.h
    stdcxx/branches/4.3.x/include/tuple
    stdcxx/branches/4.3.x/tests/utilities/20.tuple.cnstr.cpp
    stdcxx/branches/4.3.x/tests/utilities/20.tuple.creation.cpp
    stdcxx/branches/4.3.x/tests/utilities/20.tuple.elem.cpp
    stdcxx/branches/4.3.x/tests/utilities/20.tuple.h
    stdcxx/branches/4.3.x/tests/utilities/20.tuple.helpers.cpp
    stdcxx/branches/4.3.x/tests/utilities/20.tuple.rel.cpp

Modified: stdcxx/branches/4.3.x/include/rw/_tuple.h
URL: 
http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/include/rw/_tuple.h?rev=677458&r1=677457&r2=677458&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/include/rw/_tuple.h (original)
+++ stdcxx/branches/4.3.x/include/rw/_tuple.h Wed Jul 16 15:49:27 2008
@@ -122,7 +122,7 @@
 
     template <class _HeadU, class... _TailU>
     __rw_tuple (__rw_tuple<_HeadU, _TailU...>&& __tuple)
-        : _Base (_RWSTD_FORWARD (_Base, __tuple._C_tail ()))
+        : _Base (_RWSTD_MOVE (__tuple._C_tail ()))
         , _C_data (_RWSTD_MOVE (__tuple._C_head ())) { /* empty */ }
 
     template <class _HeadU, class... _TailU>

Modified: stdcxx/branches/4.3.x/include/tuple
URL: 
http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/include/tuple?rev=677458&r1=677457&r2=677458&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/include/tuple (original)
+++ stdcxx/branches/4.3.x/include/tuple Wed Jul 16 15:49:27 2008
@@ -184,7 +184,6 @@
         return *this;
     }
 
-    explicit
     tuple (const _TypeT1& __x, const _TypeT2& __y)
         : _Base (__x, __y) { /* empty */ }
 
@@ -211,9 +210,8 @@
 #    if !defined _RWSTD_NO_RVALUE_REFERENCES
 
     template <class _TypeU1, class _TypeU2>
-    explicit tuple (_TypeU1&& __x, _TypeU2&& __y)
-        : _Base (_RWSTD_FORWARD (_TypeU1, __x),
-                 _RWSTD_FORWARD (_TypeU2, __y)) { /* empty */ }
+    tuple (_TypeU1&& __x, _TypeU2&& __y)
+        : _Base (_RWSTD_MOVE (__x), _RWSTD_MOVE (__y)) { /* empty */ }
 
     tuple (tuple&& __tuple)
         : _Base (_RWSTD_FORWARD (_Base, __tuple)) { /* empty */ }

Modified: stdcxx/branches/4.3.x/tests/utilities/20.tuple.cnstr.cpp
URL: 
http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/tests/utilities/20.tuple.cnstr.cpp?rev=677458&r1=677457&r2=677458&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/tests/utilities/20.tuple.cnstr.cpp (original)
+++ stdcxx/branches/4.3.x/tests/utilities/20.tuple.cnstr.cpp Wed Jul 16 
15:49:27 2008
@@ -32,8 +32,11 @@
 #if    !defined (_RWSTD_NO_EXT_CXX_0X) \
     && !defined(_RWSTD_NO_RVALUE_REFERENCES)
 
+#include <climits>              // for CHAR_MAX
+#include <cstdlib>              // for rand
 #include <cstring>              // for strcmp
 #include <tuple>
+#include <type_traits>          // for decay
 
 #include <rw_valcmp.h>          // for rw_fltcmp
 
@@ -41,112 +44,124 @@
 
 /**************************************************************************/
 
-static void
-test_default_ctor ()
-{
-    rw_info (0, __FILE__, __LINE__, "default constructor");
+// general test function and underlying abstractions
 
-    EmptyTuple et; _RWSTD_UNUSED (et);
-    IntTuple it; _RWSTD_UNUSED (it);
-    ConstIntTuple ct; _RWSTD_UNUSED (ct);
-    // ill-formed for tuples with element types containing references
-    PairTuple pt; _RWSTD_UNUSED (pt);
-    NestedTuple nt; _RWSTD_UNUSED (nt);
-    BigTuple bt; _RWSTD_UNUSED (bt);
+template <class T, class U = T>
+bool equal (const T& x, const U& y)
+{
+    return x == y;
+}
 
-    UserClass::reset_totals ();
-    UserTuple ut; _RWSTD_UNUSED (ut);
+template <>
+bool equal (const float& x, const float& y)
+{
+    return 0 == rw_fltcmp (x, y);
+}
 
-    rw_assert (1 == UserClass::n_total_def_ctor_, __FILE__, __LINE__,
-               "tuple<UserClass>::tuple() called %d default ctors, "
-               "expected 1", UserClass::n_total_def_ctor_);
+template <>
+bool equal (const char* const& x, const char* const& y)
+{
+    return 0 == std::strcmp (x, y);
 }
 
-/**************************************************************************/
 
-#define INT_VALUE       int ('a')
+template <class T, class U>
+void assert (int line, unsigned index, const char* tuple_name,
+             const T& t, const U& u)
+{
+    const char* fmtT = FMT_SPEC (T);
+    const char* fmtU = FMT_SPEC (U);
+    rw_assert (equal (t, u), __FILE__, line,
+               "get<%d, %s> (); got [EMAIL PROTECTED], expected [EMAIL 
PROTECTED]",
+               index, tuple_name, fmtT, t, fmtU, u);
+}
 
-// assume that std::get() has been fully tested and works correctly
-#define VERIFY_TUPLE(it) \
-    rw_assert (std::get<0> (it) == INT_VALUE, __FILE__, __LINE__, \
-               "std::get<0> (" #it "), got %d, expected %d", \
-               std::get<0> (it), INT_VALUE);
+void assert (int line, unsigned index, const char* tuple_name,
+             const UserDefined& t, const UserDefined& u)
+{
+    rw_assert (equal (t, u), __FILE__, line,
+               "get<%d, %s> (); got %p [%d], expected %p [%d]",
+               index, tuple_name, &t, t.value (), &u, u.value ());
 
+    UserDefined::size_type a, e;
 
-#define LONG_VALUE      INT_VALUE
-#define STRING_VALUE    "string"
+#undef CHECK
+#define CHECK(N)          \
+    a = UserDefined::actual.N; e = UserDefined::expect.N; \
+    rw_assert (a == e, __FILE__, line, \
+               "UserDefined::" #N "; got %u, expected %u", a, e)
 
-static void
-verify_tuple (const PairTuple& pt)
-{
-    rw_assert (std::get<0> (pt) == LONG_VALUE, __FILE__, __LINE__,
-               "std::get<0> (pt), got %d, expected %d",
-               std::get<0> (pt), LONG_VALUE);
-    rw_assert (0 == std::strcmp (std::get<1> (pt), STRING_VALUE),
-               __FILE__, __LINE__,
-               "std::get<1> (pt), got %s, expected %s",
-               std::get<1> (pt), STRING_VALUE);
+    CHECK (dflt_ctor);
+    CHECK (copy_ctor);
+    CHECK (tmpl_ctor);
+    CHECK (move_ctor);
+    CHECK (copy_asgn);
+    CHECK (tmpl_asgn);
+    CHECK (move_asgn);
 }
 
+template <class T, class U>
+void assert (int line, unsigned index, const char* tuple_name,
+             const std::tuple<T>& t, const std::tuple<U>& u)
+{
+    const char* fmtT = FMT_SPEC (T);
+    const char* fmtU = FMT_SPEC (U);
+    rw_assert (equal (t, u), __FILE__, line,
+               "get<%d, %s> (); got [EMAIL PROTECTED], expected [EMAIL 
PROTECTED]",
+               index, tuple_name,
+               fmtT, std::get<0> (t), fmtU, std::get<0> (u));
+}
 
-#define USER_VALUE      user_val
 
-static UserClass user_val;
+template <unsigned Index, class Tuple, class... Elements>
+/*static*/ void
+test_impl (int line, const Tuple& tuple, const Elements&... values);
 
-typedef unsigned int uint_t;
+// terminating specialization
+template <unsigned Index, class Tuple>
+/*static*/ void
+test_impl (int, const Tuple&) {}
 
-static void
-verify_tuple (const UserTuple& ut, int line,
-              uint_t dflt = 0, uint_t copy = 0, uint_t asgn = 0)
+// generic definition
+template <unsigned Index, class Tuple, class Element, class... Elements>
+/*static*/ void
+test_impl (int line, const Tuple& tuple,
+           const Element& value, const Elements&... values)
 {
-    rw_assert (std::get<0> (ut) == USER_VALUE, __FILE__, line,
-               "std::get<0> (ut), got %d, expected %d",
-               (std::get<0> (ut)).data_.val_,
-               USER_VALUE.data_.val_);
+    // assume std::get() has been fully tested and works correctly
+    assert (line, Index, TYPE_NAME (Tuple),
+            std::get<Index> (tuple), value);
 
-    rw_assert (dflt == UserClass::n_total_def_ctor_, __FILE__, line,
-               "tuple<UserClass>::tuple() called %d default ctors, "
-               "expected %d", UserClass::n_total_def_ctor_, dflt);
-    rw_assert (copy == UserClass::n_total_copy_ctor_, __FILE__, line,
-               "tuple<UserClass>::tuple() called %d copy ctors, "
-               "expected %d", UserClass::n_total_copy_ctor_, copy);
-    rw_assert (asgn == UserClass::n_total_op_assign_, __FILE__, line,
-               "tuple<UserClass>::tuple() called %d assign ops, "
-               "expected %d", UserClass::n_total_op_assign_, asgn);
+    test_impl<Index+1> (line, tuple, values...);
 }
 
+template <class Tuple, class... Elements>
+/*static*/ void
+test (int line, const Tuple& tuple, const Elements&... values)
+{
+    test_impl<0> (line, tuple, values...);
+}
 
-#define BOOL_VALUE      true
-#define CHAR_VALUE      'a'
-#define DBL_VALUE       3.14159
-#define PTR_VALUE       ptr_val
-
-static void* ptr_val = 0;
+/**************************************************************************/
 
 static void
-verify_tuple (const BigTuple& bt)
+test_default_ctor ()
 {
-    rw_assert (std::get<0> (bt) == BOOL_VALUE, __FILE__, __LINE__,
-               "std::get<0> (bt), got %b, expected %b",
-               std::get<0> (bt), BOOL_VALUE);
-    rw_assert (std::get<1> (bt) == CHAR_VALUE, __FILE__, __LINE__,
-               "std::get<1> (bt), got %c, expected %c",
-               std::get<1> (bt), CHAR_VALUE);
-    rw_assert (std::get<2> (bt) == INT_VALUE, __FILE__, __LINE__,
-               "std::get<2> (bt), got %d, expected %d",
-               std::get<2> (bt), INT_VALUE);
-    // compare as floats because floats promoted to doubles will not
-    // be equal even if the values are logically equal
-    int result = rw_fltcmp (std::get<3> (bt), DBL_VALUE);
-    rw_assert (0 == result, __FILE__, __LINE__,
-               "std::get<3> (bt), got %f, expected %f",
-               std::get<3> (bt), DBL_VALUE);
-    rw_assert (std::get<4> (bt) == PTR_VALUE, __FILE__, __LINE__,
-               "std::get<4> (bt), got %p, expected %p",
-               std::get<4> (bt), PTR_VALUE);
-    rw_assert ((std::get<5> (bt)) == USER_VALUE, __FILE__, __LINE__,
-               "std::get<5> (bt), got %d, expected %d",
-               (std::get<5> (bt)).data_.val_, INT_VALUE);
+    rw_info (0, __FILE__, __LINE__, "default constructor");
+
+    EmptyTuple et; _RWSTD_UNUSED (et);
+    IntTuple it; _RWSTD_UNUSED (it);
+    ConstIntTuple ct; _RWSTD_UNUSED (ct);
+    // ill-formed for tuples with element types containing references
+    PairTuple pt; _RWSTD_UNUSED (pt);
+    NestedTuple nt; _RWSTD_UNUSED (nt);
+    BigTuple bt; _RWSTD_UNUSED (bt);
+
+    UserDefined::reset ();
+    UserTuple ut; _RWSTD_UNUSED (ut);
+    rw_assert (1 == UserDefined::actual.dflt_ctor, __FILE__, __LINE__,
+               "UserTuple::UserTuple (); called %d default ctors, "
+               "expected 1", UserDefined::actual.dflt_ctor);
 }
 
 /**************************************************************************/
@@ -156,37 +171,39 @@
 {
     rw_info (0, __FILE__, __LINE__, "value copy constructor");
 
-    const int i = INT_VALUE;
+    const int i = std::rand ();
     IntTuple it1 (i);
-    VERIFY_TUPLE (it1);
+    test (__LINE__, it1, i);
 
     const IntTuple it2 (i);
-    VERIFY_TUPLE (it2);
+    test (__LINE__, it2, i);
 
     ConstIntTuple ct (i);
-    VERIFY_TUPLE (ct);
+    test (__LINE__, ct, i);
 
-    int j = INT_VALUE;
+    int j = std::rand ();
     const IntRefTuple rt (j);
-    VERIFY_TUPLE (rt);
+    test (__LINE__, rt, j);
 
     NestedTuple nt (it2);
-    VERIFY_TUPLE (std::get<0> (nt));
+    //std::get<0> (it2) = std::rand (); // diliberately cause assertion
+    test (__LINE__, nt, it2);
 
-    const long l = LONG_VALUE;
-    const char* s = STRING_VALUE;
-    PairTuple pt (l, s);
-    verify_tuple (pt);
-
-    UserClass::reset_totals ();
-    const UserClass& uc = USER_VALUE;
-    UserTuple ut (uc);
-    verify_tuple (ut, __LINE__, 0, 1);
-
-    const bool b = BOOL_VALUE; const char c = CHAR_VALUE;
-    const double d = DBL_VALUE; void* const p = PTR_VALUE;
-    BigTuple bt (b, c, i, d, p, uc);
-    verify_tuple (bt);
+    const long l = std::rand ();
+    PairTuple pt (l, "string");
+    test (__LINE__, pt, l, (const char*) "string");
+
+    const UserDefined ud (i);
+    UserDefined::reset ();
+    UserTuple ut (ud);
+    UserDefined::expect.copy_ctor = 1;
+    test (__LINE__, ut, ud);
+
+    const bool b = true; const char c = 'a';
+    const double d = 3.14159; void* const p = (void*) &i;
+    BigTuple bt (b, c, i, d, p, ud);
+    ++UserDefined::expect.copy_ctor;
+    test (__LINE__, bt, b, c, i, d, p, ud);
 }
 
 /**************************************************************************/
@@ -196,40 +213,47 @@
 {
     rw_info (0, __FILE__, __LINE__, "value move constructor");
 
-    IntTuple it1 (INT_VALUE); // literal constant
-    VERIFY_TUPLE (it1);
-    int i = INT_VALUE;
-    IntTuple it2 (i); // temporary value
-    VERIFY_TUPLE (it2);
+#define INTEGER_CONSTANT        256
 
-    const IntTuple it3 (INT_VALUE);
-    VERIFY_TUPLE (it3);
+    IntTuple it1 (INTEGER_CONSTANT);
+    test (__LINE__, it1, INTEGER_CONSTANT);
+    const int c = std::rand ();
+    int i = c;   // move semantics can alter source value
+    IntTuple it2 (i);   // temporary source value
+    test (__LINE__, it2, c);
+
+    const IntTuple it3 (INTEGER_CONSTANT);
+    test (__LINE__, it3, INTEGER_CONSTANT);
+    i = c;
     const IntTuple it4 (i);
-    VERIFY_TUPLE (it4);
+    test (__LINE__, it4, c);
 
-    ConstIntTuple ct1 (INT_VALUE);
-    VERIFY_TUPLE (ct1);
+    ConstIntTuple ct1 (INTEGER_CONSTANT);
+    test (__LINE__, ct1, INTEGER_CONSTANT);
+    i = c;
     ConstIntTuple ct2 (i);
-    VERIFY_TUPLE (ct2);
+    test (__LINE__, ct2, c);
 
     // ill-formed for tuples with element types containing references
 
-    NestedTuple nt (ct1);
-    VERIFY_TUPLE (std::get<0> (nt));
+    NestedTuple nt (it1);
+    test (__LINE__, nt, it1);
 
-    PairTuple pt (LONG_VALUE, STRING_VALUE);
-    verify_tuple (pt);
+    PairTuple pt (123456789L, "string");
+    test (__LINE__, pt, 123456789L, (const char*) "string");
 
-    UserClass uc (USER_VALUE);
-    UserClass::reset_totals ();
-    UserTuple ut (uc); // may alter temporary/source value
-    // no move semantics in UserClass currently
-    verify_tuple (ut, __LINE__, 0, 1);
-
-    void* p = PTR_VALUE;
-    uc = USER_VALUE;
-    BigTuple bt (BOOL_VALUE, CHAR_VALUE, INT_VALUE, DBL_VALUE, p, uc);
-    verify_tuple (bt);
+    const UserDefined src (c);
+    UserDefined tmp (src);
+    UserDefined::reset ();
+    UserTuple ut (tmp);
+    UserDefined::expect.move_ctor = 1;
+    test (__LINE__, ut, src);
+
+    tmp = src;  ++UserDefined::expect.copy_asgn;
+    BigTuple bt (true, 'a', INTEGER_CONSTANT, 3.14159, (void*) 0, tmp);
+    ++UserDefined::expect.move_ctor;
+    test (__LINE__, bt,
+          true, 'a', INTEGER_CONSTANT, 3.14159, (void*) 0, src);
 }
 
 /**************************************************************************/
@@ -243,36 +267,40 @@
     EmptyTuple et1, et2 (et1);
     _RWSTD_UNUSED (et2);
 
-    const IntTuple it1 (INT_VALUE);
+    const int ci = std::rand ();
+    const IntTuple it1 (ci);
     IntTuple it2 (it1);
-    VERIFY_TUPLE (it2);
+    test (__LINE__, it2, ci);
 
-    const ConstIntTuple& ct1 = it1;
+    const ConstIntTuple& ct1 = it1; // same as copy ctor
     ConstIntTuple ct2 (ct1);
-    VERIFY_TUPLE (it2);
+    test (__LINE__, ct2, ci);
 
-    int i = INT_VALUE;
+    int i = ci;
     const IntRefTuple rt1 (i);
     IntRefTuple rt2 (rt1);
-    VERIFY_TUPLE (rt2);
+    test (__LINE__, rt2, ci);
 
     const NestedTuple nt1 (it1);
     NestedTuple nt2 (nt1);
-    VERIFY_TUPLE (std::get<0> (nt2));
+    test (__LINE__, nt2, it1);
 
-    const PairTuple pt1 (LONG_VALUE, STRING_VALUE);
+    const PairTuple pt1 (1234567890L, "string");
     PairTuple pt2 (pt1);
-    verify_tuple (pt2);
+    test (__LINE__, pt2, 1234567890L, (const char*) "string");
 
-    const UserTuple ut1 (USER_VALUE);
-    UserClass::reset_totals ();
+    UserDefined ud (ci);
+    const UserTuple ut1 (ud);
+    UserDefined::reset ();
     UserTuple ut2 (ut1);
-    verify_tuple (ut2, __LINE__, 0, 1);
+    ++UserDefined::expect.copy_ctor;
+    test (__LINE__, ut2, ud);
 
-    const BigTuple bt1 (BOOL_VALUE, CHAR_VALUE, INT_VALUE, DBL_VALUE,
-                        PTR_VALUE, USER_VALUE);
+    const BigTuple bt1 (true, 'a', ci, 3.14159, (void* const) &i, ud);
+    ++UserDefined::expect.move_ctor; // moved ud to bt1
     BigTuple bt2 (bt1);
-    verify_tuple (bt2);
+    ++UserDefined::expect.copy_ctor; // copied to bt2
+    test (__LINE__, bt2, true, 'a', ci, 3.14159, (void* const) &i, ud);
 }
 
 /**************************************************************************/
@@ -285,33 +313,36 @@
 
     EmptyTuple et (EmptyTuple ()); _RWSTD_UNUSED (et);
 
-    IntTuple it1 (INT_VALUE);
+    const int ci = std::rand ();
+
+    IntTuple it1 (ci);
     IntTuple it2 (std::move (it1));
-    VERIFY_TUPLE (it2);
+    test (__LINE__, it2, ci);
 
-    ConstIntTuple ct1 (INT_VALUE);
+    ConstIntTuple ct1 (ci);
     ConstIntTuple ct2 = std::move (ct1);
-    VERIFY_TUPLE (ct2);
+    test (__LINE__, ct2, ci);
 
     NestedTuple nt1 (it1);
     NestedTuple nt2 = std::move (nt1);
-    VERIFY_TUPLE (std::get<0> (nt2));
+    test (__LINE__, nt2, it1);
 
-    PairTuple pt1 (LONG_VALUE, STRING_VALUE);
+    PairTuple pt1 (1234567890L, "string");
     PairTuple pt2 (std::move (pt1));
-    verify_tuple (pt2);
+    test (__LINE__, pt2, 1234567890L, (const char*) "string");
 
-    BigTuple bt1 (BOOL_VALUE, CHAR_VALUE, INT_VALUE, DBL_VALUE,
-                  PTR_VALUE, USER_VALUE);
-    BigTuple bt2 (std::move (bt1));
-    verify_tuple (bt2);
-
-    const UserClass& uc = USER_VALUE;
-    UserTuple ut1 (uc);
-    UserClass::reset_totals ();
-    // no move semantics in UserClass currently so it uses copy ctor
+    const UserDefined ud (ci);
+    UserTuple ut1 (ud);
+    UserDefined::reset ();
     UserTuple ut2 (std::move (ut1));
-    verify_tuple (ut2, __LINE__, 0, 1);
+    ++UserDefined::expect.move_ctor;
+    test (__LINE__, ut2, ud);
+
+    BigTuple bt1 (true, 'a', ci, 3.14159, (void*) &ci, ud);
+    ++UserDefined::expect.copy_ctor;
+    BigTuple bt2 (std::move (bt1));
+    ++UserDefined::expect.move_ctor;
+    test (__LINE__, bt2, true, 'a', ci, 3.14159, (void*) &ci, ud);
 }
 
 /**************************************************************************/
@@ -327,41 +358,42 @@
     et2 = et1;
     _RWSTD_UNUSED (et2);
 
-    const IntTuple it1 (INT_VALUE);
+    int i = std::rand ();
+    const IntTuple it1 (i);
     IntTuple it2;
     it2 = it1;
-    VERIFY_TUPLE (it2);
+    test (__LINE__, it2, i);
 
     // copy assignment ill-formed for constant element types
 
-    int i = INT_VALUE;
     const IntRefTuple rt1 (i);
-    int j = 0;
+    int j = -1; // outside range of rand()
     IntRefTuple rt2 (j); // note, different reference
     rt2 = rt1;
-    VERIFY_TUPLE (rt2);
+    test (__LINE__, rt2, i);
 
     NestedTuple nt1 (it1);
     NestedTuple nt2;
     nt2 = nt1;
-    VERIFY_TUPLE (std::get<0> (nt2));
+    test (__LINE__, nt2, it1);
 
-    const PairTuple pt1 (LONG_VALUE, STRING_VALUE);
+    const PairTuple pt1 (long (i), "string");
     PairTuple pt2;
     pt2 = pt1;
-    verify_tuple (pt2);
-
-    const BigTuple bt1 (BOOL_VALUE, CHAR_VALUE, INT_VALUE, DBL_VALUE,
-                        PTR_VALUE, USER_VALUE);
-    BigTuple bt2;
-    bt2 = bt1;
-    verify_tuple (bt2);
+    test (__LINE__, pt2, long (i), (const char*) "string");
 
-    const UserTuple ut1 (USER_VALUE);
+    const UserDefined ud (i);
+    const UserTuple ut1 (ud);
     UserTuple ut2;
-    UserClass::reset_totals ();
-    ut2 = ut1;
-    verify_tuple (ut2, __LINE__, 0, 0, 1);
+    UserDefined::reset ();
+    ut2 = ut1;  ++UserDefined::expect.copy_asgn;
+    test (__LINE__, ut2, ud);
+
+    const BigTuple bt1 (true, 'a', i, 3.14159, (void* const) &i, ud);
+    ++UserDefined::expect.copy_ctor;
+    BigTuple bt2;  ++UserDefined::expect.dflt_ctor;
+    bt2 = bt1;  ++UserDefined::expect.copy_asgn;
+    test (__LINE__, bt2, true, 'a', i, 3.14159, (void* const) &i, ud);
 }
 
 /**************************************************************************/
@@ -376,44 +408,43 @@
     et2 = std::move (et1);
     _RWSTD_UNUSED (et2);
 
-    IntTuple it1 (INT_VALUE);
+    int i = std::rand ();
+
+    IntTuple it1 (i);
     IntTuple it2;
     it2 = std::move (it1);
-    VERIFY_TUPLE (it2);
+    test (__LINE__, it2, i);
 
     // move assignment ill-formed for constant element types
 
     NestedTuple nt1 (it2);
     NestedTuple nt2;
     nt2 = std::move (nt1);
-    VERIFY_TUPLE (std::get<0> (nt2));
+    test (__LINE__, nt2, it2);
 
-    PairTuple pt1 (LONG_VALUE, STRING_VALUE);
+    PairTuple pt1 (1234567890L, "string");
     PairTuple pt2;
     pt2 = std::move (pt1);
-    verify_tuple (pt2);
-
-    BigTuple bt1 (BOOL_VALUE, CHAR_VALUE, INT_VALUE, DBL_VALUE,
-                  PTR_VALUE, USER_VALUE);
-    BigTuple bt2;
-    bt2 = std::move (bt1);
-    verify_tuple (bt2);
+    test (__LINE__, pt2, 1234567890L, (const char*) "string");
 
-    const UserClass& uc = USER_VALUE;
-    UserTuple ut1 (uc);
+    const UserDefined ud (i);
+    UserTuple ut1 (ud);
     UserTuple ut2;
-    UserClass::reset_totals ();
-    ut2 = std::move (ut1);
-    verify_tuple (ut2, __LINE__, 0, 0, 1);
+    UserDefined::reset ();
+    ut2 = std::move (ut1);  ++UserDefined::expect.move_asgn;
+    test (__LINE__, ut2, ud);
+
+    BigTuple bt1 (true, 'a', i, 3.14159, (void* const) &i, ud);
+    BigTuple bt2;
+    UserDefined::reset ();
+    bt2 = std::move (bt1);  ++UserDefined::expect.move_asgn;
+    test (__LINE__, bt2, true, 'a', i, 3.14159, (void* const) &i, ud);
 }
 
 /**************************************************************************/
 
 // heterogenous tests do not apply to empty tuples so no tests required
 
-// UserClass does not currently contain any constructors or assignment
-// operators for heterogenous types so no user tuple tests performed
-
 #include <string>
 
 // need a string class with implicit conversion to type `const char*'
@@ -426,8 +457,8 @@
 
 typedef std::tuple<char>                CompatIntTuple;
 typedef std::tuple<unsigned, String>    CompatPairTuple;
-typedef std::tuple<int, int, short, float, char*,
-                   UserClass>           CompatBigTuple;
+typedef std::tuple<int, int, short, float,
+                   char*, UserDefined>  CompatBigTuple;
 
 static void
 test_hetero_copy_ctor ()
@@ -435,18 +466,24 @@
     rw_info (0, __FILE__, __LINE__,
              "copy constructor (heterogenous tuples)");
 
-    const CompatIntTuple ct1 (INT_VALUE);
-    IntTuple it (ct1);
-    VERIFY_TUPLE (it);
-
-    CompatPairTuple ct2 (LONG_VALUE, STRING_VALUE);
-    PairTuple pt (ct2);
-    verify_tuple (pt);
-
-    const CompatBigTuple ct3 (BOOL_VALUE, CHAR_VALUE, INT_VALUE,
-        DBL_VALUE, (char*) PTR_VALUE, USER_VALUE);
-    BigTuple bt (ct3);
-    verify_tuple (bt);
+    int i = 0;
+    do i = std::rand ();
+    while (i > CHAR_MAX);
+
+    const CompatIntTuple cit (static_cast<char> (i));
+    IntTuple it (cit);
+    test (__LINE__, it, i);
+
+    CompatPairTuple cpt (12345U, "string");
+    PairTuple pt (cpt);
+    test (__LINE__, pt, 12345U, (const char*) "string");
+
+    char s [] = "string"; const UserDefined ud (i);
+    const CompatBigTuple cbt (int (true), int ('a'), short (i),
+                              3.14159f, s, ud);
+    UserDefined::reset ();
+    BigTuple bt (cbt);  ++UserDefined::expect.copy_ctor;
+    test (__LINE__, bt, true, 'a', i, 3.14159f, s, ud);
 }
 
 /**************************************************************************/
@@ -457,18 +494,24 @@
     rw_info (0, __FILE__, __LINE__,
              "move constructor (heterogenous tuples)");
 
-    CompatIntTuple ct1 (INT_VALUE);
-    IntTuple it (std::move (ct1));
-    VERIFY_TUPLE (it);
-
-    CompatPairTuple ct2 (LONG_VALUE, STRING_VALUE);
-    PairTuple pt (std::move (ct2));
-    verify_tuple (pt);
-
-    CompatBigTuple ct3 (BOOL_VALUE, CHAR_VALUE, INT_VALUE,
-        DBL_VALUE, (char*) PTR_VALUE, USER_VALUE);
-    BigTuple bt (std::move (ct3));
-    verify_tuple (bt);
+    int i = 0;
+    do i = std::rand ();
+    while (i > CHAR_MAX);
+
+    CompatIntTuple cit (static_cast<char> (i));
+    IntTuple it (std::move (cit));
+    test (__LINE__, it, i);
+
+    CompatPairTuple cpt (12345U, "string");
+    PairTuple pt (std::move (cpt));
+    test (__LINE__, pt, 12345U, (const char*) "string");
+
+    char s [] = "string"; const UserDefined ud (i);
+    CompatBigTuple cbt (int (true), int ('a'), short (i),
+                        3.14159f, s, ud);
+    UserDefined::reset ();
+    BigTuple bt (std::move (cbt));  ++UserDefined::expect.move_ctor;
+    test (__LINE__, bt, true, 'a', i, 3.14159f, s, ud);
 }
 
 /**************************************************************************/
@@ -478,21 +521,28 @@
 {
     rw_info (0, __FILE__, __LINE__,
              "copy assignment operator (heterogenous tuples)");
-    CompatIntTuple ct1 (INT_VALUE);
+
+    int i = 0;
+    do i = std::rand ();
+    while (i > CHAR_MAX);
+
+    CompatIntTuple cit (static_cast<char> (i));
     IntTuple it;
-    it = ct1;
-    VERIFY_TUPLE (it);
+    it = cit;
+    test (__LINE__, it, i);
 
-    CompatPairTuple ct2 (LONG_VALUE, STRING_VALUE);
+    CompatPairTuple cpt (12345U, "string");
     PairTuple pt;
-    pt = ct2;
-    verify_tuple (pt);
+    pt = cpt;
+    test (__LINE__, pt, 12345U, (const char*) "string");
 
-    CompatBigTuple ct3 (BOOL_VALUE, CHAR_VALUE, INT_VALUE,
-        DBL_VALUE, (char*) PTR_VALUE, USER_VALUE);
+    char s [] = "string"; const UserDefined ud (i);
+    CompatBigTuple cbt (int (true), int ('a'), short (i),
+                        3.14159f, s, ud);
     BigTuple bt;
-    bt = ct3;
-    verify_tuple (bt);
+    UserDefined::reset ();
+    bt = cbt;  ++UserDefined::expect.copy_asgn;
+    test (__LINE__, bt, true, 'a', i, 3.14159f, s, ud);
 }
 
 /**************************************************************************/
@@ -503,21 +553,27 @@
     rw_info (0, __FILE__, __LINE__,
              "move assignment operator (heterogenous tuples)");
 
-    CompatIntTuple ct1 (INT_VALUE);
+    int i = 0;
+    do i = std::rand ();
+    while (i > CHAR_MAX);
+
+    CompatIntTuple cit (i);
     IntTuple it;
-    it = std::move (ct1);
-    VERIFY_TUPLE (it);
+    it = std::move (cit);
+    test (__LINE__, it, i);
 
-    CompatPairTuple ct2 (LONG_VALUE, STRING_VALUE);
+    CompatPairTuple cpt (12345U, "string");
     PairTuple pt;
-    pt = std::move (ct2);
-    verify_tuple (pt);
+    pt = std::move (cpt);
+    test (__LINE__, pt, 12345U, (const char*) "string");
 
-    CompatBigTuple ct3 (BOOL_VALUE, CHAR_VALUE, INT_VALUE,
-        DBL_VALUE, (char*) PTR_VALUE, USER_VALUE);
-    BigTuple bt;
-    bt = std::move (ct3);
-    verify_tuple (bt);
+    char s [] = "string"; const UserDefined ud (i);
+    CompatBigTuple cbt (int (true), int ('a'), short (i),
+                        3.14159f, s, ud);
+    BigTuple bt;  ++UserDefined::expect.move_ctor;
+    UserDefined::reset ();
+    bt = std::move (cbt);  ++UserDefined::expect.move_asgn;
+    test (__LINE__, bt, true, 'a', i, 3.14159f, s, ud);
 }
 
 /**************************************************************************/
@@ -535,13 +591,10 @@
 /**************************************************************************/
 
 static int
-run_test (int /*argc*/, char* argv [])
+run_test (int /*argc*/, char* /*argv*/ [])
 {
     test_default_ctor ();
 
-    ptr_val = argv [0];
-    user_val.data_.val_ = INT_VALUE;
-
     test_value_copy_ctor ();
     test_value_move_ctor ();
 

Modified: stdcxx/branches/4.3.x/tests/utilities/20.tuple.creation.cpp
URL: 
http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/tests/utilities/20.tuple.creation.cpp?rev=677458&r1=677457&r2=677458&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/tests/utilities/20.tuple.creation.cpp (original)
+++ stdcxx/branches/4.3.x/tests/utilities/20.tuple.creation.cpp Wed Jul 16 
15:49:27 2008
@@ -84,22 +84,19 @@
 
 /**************************************************************************/
 
-#define Big1stPart  bool, char, int, double
-#define Big2ndPart  void*, UserClass
-
 static void
 test_tuple_cat ()
 {
     rw_info (0, __FILE__, __LINE__, "tuple_cat");
 
 #define Big1stPart  bool, char, int, double
-#define Big2ndPart  void*, UserClass
+#define Big2ndPart  void*, UserDefined
 
     typedef std::tuple<Big1stPart> Big1stTuple;
     Big1stTuple bt1 (true, 'a', 256, 3.14159);
 
     typedef std::tuple<Big2ndPart> Big2ndTuple;
-    Big2ndTuple bt2 (&bt1, UserClass ());
+    Big2ndTuple bt2 (&bt1, UserDefined ());
 
     //BigTuple bt (tuple_cat (bt1, bt2));
 }

Modified: stdcxx/branches/4.3.x/tests/utilities/20.tuple.elem.cpp
URL: 
http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/tests/utilities/20.tuple.elem.cpp?rev=677458&r1=677457&r2=677458&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/tests/utilities/20.tuple.elem.cpp (original)
+++ stdcxx/branches/4.3.x/tests/utilities/20.tuple.elem.cpp Wed Jul 16 15:49:27 
2008
@@ -48,7 +48,7 @@
 #define USER_VAL    user_val
 
 static void*        ptr_val;
-static UserClass    user_val;
+static UserDefined  user_val;
 
 static void
 test_const_get (const BigTuple& bt)
@@ -75,10 +75,10 @@
     rw_assert (p == PTR_VAL, __FILE__, __LINE__,
                "get<4>(bt), got %p, expected %p", p, PTR_VAL);
 
-    const UserClass& uc = std::get<5> (bt);
+    const UserDefined& uc = std::get<5> (bt);
     rw_assert (uc == USER_VAL, __FILE__, __LINE__,
                "get<5>(bt), got %d, expected %d",
-               uc.data_.val_, USER_VAL.data_.val_);
+               uc.value (), USER_VAL.value ());
 }
 
 /**************************************************************************/
@@ -127,14 +127,14 @@
     rw_assert (std::get<4> (bt) == &d, __FILE__, __LINE__,
                "get<4>(bt), got %p, expected %p", std::get<4> (bt), &d);
 
-    UserClass& uc = std::get<5> (bt);
+    UserDefined& uc = std::get<5> (bt);
     rw_assert (uc == USER_VAL, __FILE__, __LINE__,
                "get<5>(bt), got %d, expected %d",
-               uc.data_.val_, USER_VAL.data_.val_);
-    uc.data_.val_ = INT_VAL;
-    rw_assert ((std::get<5> (bt)).data_.val_ == INT_VAL, __FILE__, __LINE__,
+               uc.value (), USER_VAL.value ());
+    uc = UserDefined (INT_VAL);
+    rw_assert ((std::get<5> (bt)).value () == INT_VAL, __FILE__, __LINE__,
                "get<5>(bt), got %d, expected %d",
-               (std::get<5> (bt)).data_.val_, INT_VAL);
+               (std::get<5> (bt)).value (), INT_VAL);
 }
 
 /**************************************************************************/

Modified: stdcxx/branches/4.3.x/tests/utilities/20.tuple.h
URL: 
http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/tests/utilities/20.tuple.h?rev=677458&r1=677457&r2=677458&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/tests/utilities/20.tuple.h (original)
+++ stdcxx/branches/4.3.x/tests/utilities/20.tuple.h Wed Jul 16 15:49:27 2008
@@ -29,10 +29,141 @@
 #ifndef RW_20_TUPLE_H_INCLUDED
 #define RW_20_TUPLE_H_INCLUDED
 
+#include <ostream>              // for std::ostream
 #include <tuple>
+#include <type_traits>          // for std::decay
+#include <utility>              // for std::move
 
-#include <rw_value.h>                       // for UserClass
 
+// user-defined class for tuple testing (similar to UserClass)
+
+class UserDefined
+{
+
+    int                 value_;         // some arbitrary value
+
+public:
+
+    // types
+
+    typedef int         value_type;
+    typedef unsigned    size_type;
+
+    struct count_type   // number of constructors/operators called
+    {
+        size_type   dflt_ctor;
+        size_type   copy_ctor;
+        size_type   tmpl_ctor;
+        size_type   move_ctor;
+        size_type   copy_asgn;
+        size_type   tmpl_asgn;
+        size_type   move_asgn;
+    };
+
+    static count_type   actual;         // since last reset()
+    static count_type   expect;         // modified by expect()
+
+
+    // constructors
+
+    UserDefined ()
+        : value_ () { ++actual.dflt_ctor; }
+
+    UserDefined (const UserDefined& src)
+        : value_ (src.value_) { ++actual.copy_ctor; }
+
+#if !defined _RWSTD_NO_RVALUE_REFERENCES
+
+    UserDefined (UserDefined&& src)
+        : value_ (std::move (src.value_))
+        { ++actual.move_ctor; }
+
+    // Requires: U is convertible to `value_type'.
+    template <class U >
+    explicit UserDefined (U&& u)
+        : value_ (std::move (u)) { ++actual.tmpl_ctor; }
+
+#endif   // !defined _RWSTD_NO_RVALUE_REFERENCES
+
+
+    // assignment
+
+    UserDefined& operator= (const UserDefined& src)
+    {
+        value_ = src.value_;
+        ++actual.copy_asgn;
+        return *this;
+    }
+
+    template <class U>
+    UserDefined& operator= (const U& src)
+    {
+        value_ = src;
+        ++actual.tmpl_asgn;
+        return *this;
+    }
+
+#if !defined _RWSTD_NO_RVALUE_REFERENCES
+
+    UserDefined& operator= (const UserDefined&& src)
+    {
+        value_ = std::move (src.value_);
+        ++actual.move_asgn;
+        return *this;
+    }
+
+#endif   // !defined _RWSTD_NO_RVALUE_REFERENCES
+
+
+    // accessors
+
+    value_type value () const { return value_; }
+
+    //void value (const value_type& value) { value_ = value; }
+
+    // testing
+
+    static void reset ()
+    {
+        actual.dflt_ctor = actual.copy_ctor = actual.tmpl_ctor =
+        actual.move_ctor = actual.copy_asgn = actual.move_asgn =
+        actual.tmpl_asgn = 0;
+
+        expect.dflt_ctor = expect.copy_ctor = expect.tmpl_ctor =
+        expect.move_ctor = expect.copy_asgn = expect.move_asgn =
+        expect.tmpl_asgn = 0;
+    }
+
+
+    // implicit value_type conversion?
+};
+
+UserDefined::count_type
+UserDefined::actual = { 0, 0, 0, 0, 0, 0, 0 };
+
+UserDefined::count_type
+UserDefined::expect = { 0, 0, 0, 0, 0, 0, 0 };
+
+inline bool
+operator== (const UserDefined& lhs, const UserDefined& rhs)
+{
+    return lhs.value () == rhs.value ();
+}
+
+inline bool
+operator< (const UserDefined& lhs, const UserDefined& rhs)
+{
+    return lhs.value () < rhs.value ();
+}
+
+inline std::ostream&
+operator< (std::ostream& os, const UserDefined& src)
+{
+    os << "UserDefined@" << &src << " [value_ = " << src.value () << "]";
+    return os;
+}
+
+/**************************************************************************/
 
 // various tuple types for test purposes
 
@@ -46,12 +177,76 @@
 
 typedef std::tuple <long, const char*>      PairTuple;
 
-typedef std::tuple <UserClass>              UserTuple;
+typedef std::tuple <UserDefined>            UserTuple;
 
-#define BIG_TYPES   bool, char, int, double, void*, UserClass
+#define BIG_TYPES   bool, char, int, double, void*, UserDefined
 #define BIG_SIZE    6
 
 typedef std::tuple <BIG_TYPES>              BigTuple;
 
 
+// tuple names
+
+template <class T>
+struct type_name_ { static const char* value; };
+
+#define TYPE_NAME(T)    \
+template <> const char* type_name_<T>::value = #T;
+
+TYPE_NAME (std::tuple<>)
+TYPE_NAME (std::tuple<int>)
+TYPE_NAME (std::tuple<const int>)
+TYPE_NAME (std::tuple<int&>)
+TYPE_NAME (std::tuple<std::tuple<int> >)
+TYPE_NAME (std::tuple<UserDefined>)
+
+#undef TYPE_NAME
+#define TYPE_NAME(T, S) \
+template <> const char* type_name_<T>::value = S;
+
+#undef TUPLE
+#define TUPLE           std::tuple<long, const char*>
+TYPE_NAME (TUPLE, "std::tuple<long, const char*>")
+
+#undef TUPLE
+#define TUPLE           std::tuple<BIG_TYPES>
+// should use BIG_TYPES in string if possible
+TYPE_NAME (TUPLE, "std::tuple<bool, char, int, double, void*, " \
+                  "UserDefined>")
+
+#undef TUPLE
+
+#undef TYPE_NAME
+#define TYPE_NAME(T)    type_name_<T>::value
+
+/**************************************************************************/
+
+// formatting specifiers
+
+template <class T>
+struct fmt_spec { static const char* value; };
+
+#define FMT_SPEC(T, S)  \
+template <> const char* fmt_spec<T>::value = #S;
+
+FMT_SPEC (bool, %b)
+FMT_SPEC (char, %c)
+FMT_SPEC (int, %d)
+FMT_SPEC (unsigned, %u)
+FMT_SPEC (long, %ld)
+FMT_SPEC (float, %f)
+FMT_SPEC (double, %f)
+FMT_SPEC (char*, %s)
+FMT_SPEC (char const*, %s)
+FMT_SPEC (void*, %p)
+FMT_SPEC (void const*, %p)
+
+#undef DECAY
+#define DECAY(T)        typename std::decay<T>::type
+
+// ignore cv-qualifiers and references
+#undef FMT_SPEC
+#define FMT_SPEC(T)     fmt_spec<DECAY (T)>::value
+
+
 #endif   // define RW_20_TUPLE_H_INCLUDED

Modified: stdcxx/branches/4.3.x/tests/utilities/20.tuple.helpers.cpp
URL: 
http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/tests/utilities/20.tuple.helpers.cpp?rev=677458&r1=677457&r2=677458&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/tests/utilities/20.tuple.helpers.cpp (original)
+++ stdcxx/branches/4.3.x/tests/utilities/20.tuple.helpers.cpp Wed Jul 16 
15:49:27 2008
@@ -73,7 +73,7 @@
     enum {
         inherited,
         const_int,
-        user_class,
+        user_defined,
         int_tuple
     } type_id;
 
@@ -86,8 +86,8 @@
     any_t (const int)
         : rw_any_t (char ()), type_id (const_int) { }
 
-    any_t (UserClass)
-        : rw_any_t (char ()), type_id (user_class) { }
+    any_t (UserDefined)
+        : rw_any_t (char ()), type_id (user_defined) { }
 
     any_t (std::tuple< int >)
         : rw_any_t (char ()), type_id (int_tuple) { }
@@ -95,7 +95,7 @@
     const char* type_name () const
     {
         return type_id == const_int? "const int":
-               type_id == user_class? "UserClass":
+               type_id == user_defined? "UserDefined":
                type_id == int_tuple? "std::tuple<int>":
                rw_any_t::type_name ();
     }
@@ -121,7 +121,7 @@
     TEST (0, IntTuple, int);
     TEST (0, ConstIntTuple, const int);
     TEST (0, NestedTuple, std::tuple<int>);
-    TEST (0, UserTuple, UserClass);
+    TEST (0, UserTuple, UserDefined);
 
     TEST (0, PairTuple, long);
     TEST (1, PairTuple, const char*);
@@ -131,7 +131,7 @@
     TEST (2, BigTuple, int);
     TEST (3, BigTuple, double);
     TEST (4, BigTuple, void*);
-    TEST (5, BigTuple, UserClass);
+    TEST (5, BigTuple, UserDefined);
 }
 
 /**************************************************************************/

Modified: stdcxx/branches/4.3.x/tests/utilities/20.tuple.rel.cpp
URL: 
http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/tests/utilities/20.tuple.rel.cpp?rev=677458&r1=677457&r2=677458&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/tests/utilities/20.tuple.rel.cpp (original)
+++ stdcxx/branches/4.3.x/tests/utilities/20.tuple.rel.cpp Wed Jul 16 15:49:27 
2008
@@ -55,15 +55,15 @@
     rw_assert (it1 == it2, __FILE__, __LINE__,
                "it1 == it2, got false, expected true");
 
-    UserClass uc;
-    UserTuple ut1 (uc), ut2 (uc);
+    UserDefined ud;
+    UserTuple ut1 (ud), ut2 (ud);
     rw_assert (ut1 == ut1, __FILE__, __LINE__,
                "ut1 == ut1, got false, expected true");
     rw_assert (ut1 == ut2, __FILE__, __LINE__,
                "ut1 == ut2, got false, expected true");
 
-    BigTuple bt1 (true, 'a', 256, 3.14159, &nt1, uc);
-    BigTuple bt2 (true, 'a', 256, 3.14159, &nt1, uc);
+    BigTuple bt1 (true, 'a', 256, 3.14159, &nt1, ud);
+    BigTuple bt2 (true, 'a', 256, 3.14159, &nt1, ud);
     rw_assert (bt1 == bt1, __FILE__, __LINE__,
                "bt1 == bt1, got false, expected true");
     rw_assert (bt1 == bt2, __FILE__, __LINE__,
@@ -87,15 +87,13 @@
     rw_assert (it1 < it2, __FILE__, __LINE__,
                "it1 < it2, got false, expected true");
 
-    UserClass uc1, uc2;
-    uc1.data_.val_ = 1, uc2.data_.val_ = 2;
-
-    UserTuple ut1 (uc1), ut2 (uc2);
+    UserDefined ud1 (1), ud2 (2);
+    UserTuple ut1 (ud1), ut2 (ud2);
     rw_assert (ut1 < ut2, __FILE__, __LINE__,
                "ut1 < ut2, got false, expected true");
 
-    BigTuple bt1 (true, 'a', 255, 3.14159, &nt1, uc1);
-    BigTuple bt2 (true, 'a', 256, 3.14159, &nt1, uc1);
+    BigTuple bt1 (true, 'a', 255, 3.14159, &nt1, ud1);
+    BigTuple bt2 (true, 'a', 256, 3.14159, &nt1, ud1);
     rw_assert (bt1 < bt2, __FILE__, __LINE__,
                "bt1 < bt2, got false, expected true");
 }


Reply via email to