You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@stdcxx.apache.org by el...@apache.org on 2008/07/02 01:19:48 UTC

svn commit: r673227 - in /stdcxx/branches/4.3.x: include/rw/_forward.h include/rw/_tuple.h include/tuple tests/utilities/20.tuple.cnstr.cpp tests/utilities/20.tuple.creation.cpp tests/utilities/20.tuple.h

Author: elemings
Date: Tue Jul  1 16:19:48 2008
New Revision: 673227

URL: http://svn.apache.org/viewvc?rev=673227&view=rev
Log:
2008-07-01  Eric Lemings <er...@roguewave.com>

	STDCXX-958
	* include/tuple: Uncomment ctors that were temporarily commented
	out (and accidently checked in) due to forward/move semantics
	problem in make_tuple() with reference wrappers.
	* include/rw/_forward.h: Remove unnecessary _EXPORT macro.
	Define functions as inline.  Change `std' namespace to `_STD' in
	definition of _RWSTD_MOVE function macro.
	* include/rw/_tuple.h: Fix forward/move semantics for homogenous
	move ctor.
	* tests/utilities/20.tuple.h: Add tuple with reference type.
	* tests/utilities/20.tuple.cnstr.cpp: Added tests for tuples
	with reference types.  Added more tests for value move ctors.
	* tests/utilities/20.tuple.creation.cpp: Added two small tests
	for make_tuple() with reference wrappers.


Modified:
    stdcxx/branches/4.3.x/include/rw/_forward.h
    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.h

Modified: stdcxx/branches/4.3.x/include/rw/_forward.h
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/include/rw/_forward.h?rev=673227&r1=673226&r2=673227&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/include/rw/_forward.h (original)
+++ stdcxx/branches/4.3.x/include/rw/_forward.h Tue Jul  1 16:19:48 2008
@@ -45,7 +45,6 @@
 
 // 20.2.2, forward/move helpers:
 
-_EXPORT
 template <class _Type>
 struct identity
 {
@@ -61,25 +60,23 @@
 
 #    if !defined _RWSTD_NO_RVALUE_REFERENCES
 
-_EXPORT
 template <class _Type>
-_Type&&
+inline _Type&&
 forward (_TYPENAME identity<_Type>::type&& __x)
 {
     return __x;
 }
 
 
-_EXPORT
 template <class _Type>
-_TYPENAME _RWSTD_REMOVE_REFERENCE(_Type)&&
+inline _TYPENAME _RWSTD_REMOVE_REFERENCE(_Type)&&
 move (_Type&& __x)
 {
     return __x;
 }
 
 #      define _RWSTD_FORWARD(_Type, __x)    _STD::forward<_Type> (__x)
-#      define _RWSTD_MOVE(__x)              std::move (__x)
+#      define _RWSTD_MOVE(__x)              _STD::move (__x)
 
 #    else   // no rvalue references
 

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=673227&r1=673226&r2=673227&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/include/rw/_tuple.h (original)
+++ stdcxx/branches/4.3.x/include/rw/_tuple.h Tue Jul  1 16:19:48 2008
@@ -100,8 +100,8 @@
 #      if !defined _RWSTD_NO_RVALUE_REFERENCES
 
     __rw_tuple (__rw_tuple&& __tuple)
-        : _Base (_RWSTD_FORWARD (_Base, __tuple._C_tail ()))
-        , _C_data (_RWSTD_MOVE (__tuple._C_data)) { /* empty */ }
+        : _Base (std::move<_Base&&> (__tuple._C_tail ()))
+        , _C_data (_RWSTD_FORWARD (_HeadT, __tuple._C_data)) { /* empty */ }
 
     __rw_tuple& operator= (__rw_tuple&& __tuple) {
         _Base::operator= (_RWSTD_FORWARD (_Base, __tuple._C_tail ()));

Modified: stdcxx/branches/4.3.x/include/tuple
URL: http://svn.apache.org/viewvc/stdcxx/branches/4.3.x/include/tuple?rev=673227&r1=673226&r2=673227&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/include/tuple (original)
+++ stdcxx/branches/4.3.x/include/tuple Tue Jul  1 16:19:48 2008
@@ -97,8 +97,8 @@
 
 #    if !defined _RWSTD_NO_RVALUE_REFERENCES
 
-    //tuple (tuple&& __tuple)
-        //: _Base (_RWSTD_FORWARD (_Base, __tuple)) { /* empty */ }
+    tuple (tuple&& __tuple)
+        : _Base (_RWSTD_FORWARD (_Base, __tuple)) { /* empty */ }
 
     tuple& operator= (tuple&& __tuple) {
         _Base::operator= (_RWSTD_FORWARD (_Base, __tuple));
@@ -109,9 +109,9 @@
     _EXPLICIT tuple (_TypesU&&... __values)
         : _Base (_RWSTD_FORWARD (_TypesU, __values)...) { /* empty */ }
 
-    //template <class... _TypesU>
-    //tuple (tuple<_TypesU...>&& __tuple)
-        //: _Base (_RWSTD_FORWARD (_BaseU, __tuple)) { /* empty */ }
+    template <class... _TypesU>
+    tuple (tuple<_TypesU...>&& __tuple)
+        : _Base (_RWSTD_FORWARD (_BaseU, __tuple)) { /* empty */ }
 
     template <class... _TypesU>
     tuple& operator= (tuple<_TypesU...>&& __tuple) {

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=673227&r1=673226&r2=673227&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 Tue Jul  1 16:19:48 2008
@@ -45,6 +45,7 @@
     EmptyTuple et; _RWSTD_UNUSED (et);
     IntTuple it; _RWSTD_UNUSED (it);
     ConstIntTuple ct; _RWSTD_UNUSED (ct);
+    //IntRefTuple rt; _RWSTD_UNUSED (rt); // ill-formed for references
     PairTuple pt; _RWSTD_UNUSED (pt);
     NestedTuple nt; _RWSTD_UNUSED (nt);
     BigTuple bt; _RWSTD_UNUSED (bt);
@@ -67,11 +68,11 @@
 {
     rw_info (0, __FILE__, __LINE__, "value copy constructor");
 
-    const int i = 1;
+    int i = 1;
     IntTuple it1 (i); _RWSTD_UNUSED (it1);
     const IntTuple it2 (i); _RWSTD_UNUSED (it2);
-
     ConstIntTuple ct (i); _RWSTD_UNUSED (ct);
+    IntRefTuple rt (i); _RWSTD_UNUSED (rt);
 
     NestedTuple nt (it2); _RWSTD_UNUSED (nt);
 
@@ -102,10 +103,20 @@
 {
     rw_info (0, __FILE__, __LINE__, "value move constructor");
 
-    const IntTuple it (1);
-    ConstIntTuple ct (1); _RWSTD_UNUSED (ct);
+    IntTuple it1 (1); _RWSTD_UNUSED (it1);
+    IntTuple it2 (int ()); _RWSTD_UNUSED (it2);
+
+    const IntTuple it3 (1); _RWSTD_UNUSED (it3);
+    const IntTuple it4 (const IntTuple ()); _RWSTD_UNUSED (it4);
+
+    ConstIntTuple ct1 (1); _RWSTD_UNUSED (ct1);
+    ConstIntTuple ct2 (ConstIntTuple ()); _RWSTD_UNUSED (ct2);
+
+    IntRefTuple rt2 (int ()); _RWSTD_UNUSED (rt2);
+
+    NestedTuple nt (ct1); _RWSTD_UNUSED (nt);
+
     PairTuple pt (1L, "string"); _RWSTD_UNUSED (pt);
-    NestedTuple nt (it); _RWSTD_UNUSED (nt);
 
     BigTuple bt (true, 'a', 1, 1.0, (void*)0, UserClass ());
     _RWSTD_UNUSED (bt);
@@ -138,6 +149,9 @@
     const ConstIntTuple ct1;
     ConstIntTuple ct2 (ct1); _RWSTD_UNUSED (ct2);
 
+    int i; const IntRefTuple rt1 (i);
+    IntRefTuple rt2 (rt1); _RWSTD_UNUSED (rt2);
+
     const PairTuple pt1;
     PairTuple pt2 (pt1); _RWSTD_UNUSED (pt2);
 

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=673227&r1=673226&r2=673227&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 Tue Jul  1 16:19:48 2008
@@ -55,6 +55,9 @@
     const int j = 3;
     IntTuple3 it3 = std::make_tuple (1, i, j);
 
+    IntRefTuple rt1 = std::make_tuple (std::ref (i));
+
+    std::tuple<const int&> rt2 = std::make_tuple (std::cref (i));
 }
 
 /**************************************************************************/

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=673227&r1=673226&r2=673227&view=diff
==============================================================================
--- stdcxx/branches/4.3.x/tests/utilities/20.tuple.h (original)
+++ stdcxx/branches/4.3.x/tests/utilities/20.tuple.h Tue Jul  1 16:19:48 2008
@@ -37,11 +37,16 @@
 // various tuple types for test purposes
 
 typedef std::tuple < >                      EmptyTuple;
+
 typedef std::tuple < int >                  IntTuple;
 typedef std::tuple < const int >            ConstIntTuple;
+typedef std::tuple < int& >                 IntRefTuple;
+
+typedef std::tuple < std::tuple < int > >   NestedTuple;
+
 typedef std::tuple < long, const char* >    PairTuple;
+
 typedef std::tuple < UserClass >            UserTuple;
-typedef std::tuple < std::tuple < int > >   NestedTuple;
 
 #define BigList      bool, char, int, double, void*, UserClass
 #define BigListSize  6