Boost logo

Boost-Commit :

Subject: [Boost-commit] svn:boost r72571 - sandbox/conversion/libs/conversion_ext/test
From: vicente.botet_at_[hidden]
Date: 2011-06-13 13:21:16


Author: viboes
Date: 2011-06-13 13:21:15 EDT (Mon, 13 Jun 2011)
New Revision: 72571
URL: http://svn.boost.org/trac/boost/changeset/72571

Log:
Conversion: Make a distiction between implicit and explicit converter
Text files modified:
   sandbox/conversion/libs/conversion_ext/test/array.cpp | 2
   sandbox/conversion/libs/conversion_ext/test/extrinsec.cpp | 177 ++++++++++++++++++++++++++++++++++++---
   sandbox/conversion/libs/conversion_ext/test/intrinsec.cpp | 148 ++++++++++++++++++++++++--------
   sandbox/conversion/libs/conversion_ext/test/pair.cpp | 6 +
   4 files changed, 279 insertions(+), 54 deletions(-)

Modified: sandbox/conversion/libs/conversion_ext/test/array.cpp
==============================================================================
--- sandbox/conversion/libs/conversion_ext/test/array.cpp (original)
+++ sandbox/conversion/libs/conversion_ext/test/array.cpp 2011-06-13 13:21:15 EDT (Mon, 13 Jun 2011)
@@ -8,9 +8,9 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+#include <iostream>
 #include <boost/conversion/convert_to.hpp>
 #include <boost/conversion/boost/array.hpp>
-#include <iostream>
 #include <boost/detail/lightweight_test.hpp>
 #include "helper.hpp"
 #include <boost/static_assert.hpp>

Modified: sandbox/conversion/libs/conversion_ext/test/extrinsec.cpp
==============================================================================
--- sandbox/conversion/libs/conversion_ext/test/extrinsec.cpp (original)
+++ sandbox/conversion/libs/conversion_ext/test/extrinsec.cpp 2011-06-13 13:21:15 EDT (Mon, 13 Jun 2011)
@@ -8,7 +8,9 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+#include <boost/conversion/explicit_convert_to.hpp>
 #include <boost/conversion/convert_to.hpp>
+#include <boost/conversion/assign_to.hpp>
 #include <boost/conversion/ca_wrapper.hpp>
 #include <boost/conversion/convertible_to.hpp>
 #include <boost/conversion/convertible_from.hpp>
@@ -20,6 +22,7 @@
 
 
 using namespace boost;
+using namespace boost::conversion;
 
 struct A{};
 struct B{
@@ -27,19 +30,9 @@
 };
 struct C{};
 
-void f(B) {}
-
-void g(boost::conversion::convertible_to<B> cb)
-{
- cb.get().k();
- return f(cb);
-}
-
-
-
 
 #if defined(BOOST_CONVERSION_DOUBLE_CP)
- A convert_to(const B&, boost::conversion::dummy::type_tag<A> const&) {
+ A convert_to(const B&, dummy::type_tag<A> const&) {
     return A();
   }
 
@@ -47,7 +40,7 @@
     return to;
   }
 
- B convert_to(const C&, boost::conversion::dummy::type_tag<B> const&) {
+ B convert_to(const C&, dummy::type_tag<B> const&) {
     return B();
   }
 
@@ -81,12 +74,163 @@
 #endif
 
 
+ void f(B) {}
+
+ void g(convertible_to<B> cb)
+ {
+ cb.get().k(); // need for get()
+ return f(cb); // implicit conversion from cb to B applies
+ }
+
   template <typename T>
   typename boost::enable_if<boost::is_extrinsic_convertible<T,B>, void >::type
   h(T v)
   {
- return f(boost::conversion::convert_to<B>(v));
+ return f(convert_to<B>(v));
+ }
+
+//////////
+struct X{};
+
+struct ICF_X {
+};
+
+namespace boost {
+ namespace conversion {
+ template <>
+ struct converter_cp< ICF_X, X > : true_type {
+ ICF_X operator()(X const &)
+ {
+ return ICF_X();
+ }
+ };
   }
+}
+
+struct ECF_X {
+};
+
+namespace boost {
+ namespace conversion {
+ template <>
+ struct explicit_converter_cp< ECF_X, X > : true_type {
+ ECF_X operator()(X const &)
+ {
+ return ECF_X();
+ }
+ };
+ }
+}
+
+struct ICT_X {
+};
+
+namespace boost {
+ namespace conversion {
+ template <>
+ struct converter_cp< X, ICT_X > : true_type {
+ X operator()(ICT_X const &)
+ {
+ return X();
+ }
+ };
+ }
+}
+
+struct ECT_X {
+};
+
+namespace boost {
+ namespace conversion {
+ template <>
+ struct explicit_converter_cp< X, ECT_X > : true_type {
+ X operator()(ECT_X const &)
+ {
+ return X();
+ }
+ };
+ }
+}
+
+
+struct AF_X {
+};
+
+namespace boost {
+ namespace conversion {
+ template <>
+ struct assigner_cp< AF_X, X > : true_type {
+ AF_X& operator()(AF_X &lhs, X const&)
+ {
+ return lhs;
+ }
+ };
+ }
+}
+
+//////////////////////////
+
+ void xconvert_to_with_implicit_constructor()
+ {
+ {
+ X x;
+ ICF_X y1(convert_to<ICF_X>(x));
+ ICF_X y2(mcf(x));
+ mat(y2) = x;
+ }
+ }
+
+ #define BOOST_CONVERSION_CONSTRUCT(T, VAR, EXPR) \
+ T VAR(boost::conversion::explicit_convert_to<T>(EXPR))
+
+ void xconvert_to_with_explicit_constructor()
+ {
+ {
+ X x;
+ //ECF_X y(convert_to<ECF_X>(x)); // compile must fail
+ BOOST_CONVERSION_CONSTRUCT(ECF_X, y, x); // Maybe a macro !!!
+ ECF_X y1_1(explicit_convert_to<ECF_X>(x));
+ //ECF_X y1_2(mcf(x)); // fail as there is no implicit conversion.
+ ECF_X y2 = explicit_convert_to<ECF_X>(x);
+ //mat(y2) = x; // fails as no implicit conversion
+ }
+
+ }
+
+ void xconvert_to_with_implicit_conversion_operator()
+ {
+ {
+ ICT_X y;
+ X x1(convert_to<X>(y));
+ X x2(mcf(y));
+ X x3=convert_to<X>(y);
+ X x4=mcf(y);
+ mat(x4) = y;
+ }
+
+ }
+ void xconvert_to_with_explicit_conversion_operator()
+ {
+ {
+ ECT_X y;
+ X x1(explicit_convert_to<X>(y));
+ X x2=explicit_convert_to<X>(y);
+ }
+ }
+ void xassign_to_with_assignemet_operator()
+ {
+ {
+ X x;
+ //AF_X y1(x); // compile fails
+ AF_X y2;
+ //y2=x; // compile fails
+ assign_to(y2,x);
+ mat(y2)=x;
+ }
+ }
+////
+
+
 
 void explicit_convert_to() {
   using namespace boost::conversion;
@@ -119,7 +263,7 @@
 
 void implicit_conversion_via_mca() {
   C c;
- f(boost::conversion::mca(c));
+ f(mca(c));
 }
 
 void implicit_conversion_via_mcf() {
@@ -141,6 +285,11 @@
 
 int main( )
 {
+ xconvert_to_with_implicit_constructor();
+ xconvert_to_with_explicit_constructor();
+ xconvert_to_with_implicit_conversion_operator();
+ xconvert_to_with_explicit_conversion_operator();
+ xassign_to_with_assignemet_operator();
   explicit_convert_to();
   explicit_assign_to();
   explicit_chain_assign_to();

Modified: sandbox/conversion/libs/conversion_ext/test/intrinsec.cpp
==============================================================================
--- sandbox/conversion/libs/conversion_ext/test/intrinsec.cpp (original)
+++ sandbox/conversion/libs/conversion_ext/test/intrinsec.cpp 2011-06-13 13:21:15 EDT (Mon, 13 Jun 2011)
@@ -8,12 +8,17 @@
 //
 //////////////////////////////////////////////////////////////////////////////
 
+#include <boost/conversion/explicit_convert_to.hpp>
 #include <boost/conversion/convert_to.hpp>
+#include <boost/conversion/assign_to.hpp>
 #include <boost/conversion/ca_wrapper.hpp>
+#include <boost/conversion/assignable_to.hpp>
+#include <boost/conversion/convertible_from.hpp>
 #include <iostream>
 #include <boost/detail/lightweight_test.hpp>
 
 using namespace boost;
+using namespace boost::conversion;
 
 struct B{};
 struct A {
@@ -21,16 +26,17 @@
     A(const B&){}
 };
 struct AE {
- explicit AE(const B&){}
+ explicit AE(B){}
 };
 struct AA {
   AA(int){}
   AA(const A&){}
   AA& operator=(const A&) { return *this;}
+ //AA& operator=(const B&) { return *this;}
 };
 
 struct C {
- operator B() const{return B();}
+ operator B() const{ return B(); }
 };
 struct CC {
   CC(int){}
@@ -38,42 +44,104 @@
   CC& operator=(const B&) { return *this;}
 };
 
-void convert_to_with_implicit_constructor() {
- {
- B b;
- A a(b);
- }
- {
- B b;
- A a(boost::conversion::convert_to<A>(b));
- }
+//////////
+struct X{};
 
-}
-void convert_to_with_explicit_constructor() {
- {
- B b;
- AE ae(b);
- }
- {
- B b;
- AE ae(boost::conversion::convert_to<AE>(b));
- }
+struct ICF_X {
+ ICF_X(X const&) {}
+};
+struct ECF_X {
+ explicit ECF_X(X const&) {}
+};
+
+struct ICT_X {
+ operator X() const{ return X(); }
+};
+
+#ifndef BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+struct ECT_X {
+ explicit operator X() const { return X(); }
+};
+#endif
+
+struct AF_X {
+ AF_X& operator=(X) { return *this; }
+};
+
+//////////////////////////
+
+void convert_to_with_implicit_constructor()
+{
+ {
+ X x;
+ ICF_X y1(x);
+ ICF_X y2 = x;
+ }
+ {
+ X x;
+ ICF_X y(convert_to<ICF_X>(x));
+ }
+}
+
+#define BOOST_CONVERSION_CONSTRUCT(T, VAR, EXPR) \
+ T VAR(boost::conversion::explicit_convert_to<T>(EXPR))
+
+void explicit_convert_to_with_explicit_constructor() {
+ {
+ X x;
+ ECF_X y1(x);
+ //ECF_X y2=x; // compile fails
+ ECF_X y2=ECF_X(x);
+ }
+ {
+ X x;
+ //ECF_X y(convert_to<ECF_X>(x)); // compile must fail
+ BOOST_CONVERSION_CONSTRUCT(ECF_X, y, x); // Maybe a macro !!!
+ ECF_X y1_1(explicit_convert_to<ECF_X>(x));
+ ECF_X y1_2(mcf(x)); // doesn't fail as there is the constructor from X, but will fails for extrinsic conversion.
+ ECF_X y2 = explicit_convert_to<ECF_X>(x);
+ }
 
 }
 
-void convert_to_with_conversion_operator() {
- {
- C c;
- A a(c);
- }
- {
- C c;
- A a(boost::conversion::convert_to<A>(c));
- }
+void convert_to_with_implicit_conversion_operator() {
+ {
+ ICT_X y;
+ X x1(y);
+ X x2=y;
+ }
+ {
+ ICT_X y;
+ X x1(convert_to<X>(y));
+ X x2=convert_to<X>(y);
+ }
+}
+void explicit_convert_to_with_explicit_conversion_operator() {
+#ifndef BOOST_NO_EXPLICIT_CONVERSION_OPERATORS
+#error
+ {
+ ECT_X y;
+ X x1(y);
+ X x2=X(y);
+ }
+ {
+ ECT_X y;
+ X x1(explicit_convert_to<X>(y));
+ X x2=explicit_convert_to<X>(y);
+ }
+#endif
 
 }
 void assign_to_with_assignemet_operator() {
- {
+ {
+ X x;
+ //AF_X y1(x); // compile fails
+ AF_X y2;
+ y2=x;
+ assign_to(y2,x);
+ mat(y2)=x;
+ }
+ {
     A a(0);
     AA aa(0);
     aa=a;
@@ -81,13 +149,14 @@
     {
     A a(0);
     AA aa(0);
- boost::conversion::assign_to(aa,a);
+ assign_to(aa,a);
     }
+
 }
 void mca_with_assignemet_operator() {
     A a(0);
     AA aa(0);
- boost::conversion::mca(aa) =a;
+ mca(aa) =a;
 }
 
 void assign_to_with_assignemet_operator_and_implicit_constructor() {
@@ -99,13 +168,13 @@
     {
     B b;
     AA aa(1);
- boost::conversion::assign_to(aa,b);
+ assign_to(aa,b);
     }
 }
 void mca_with_assignemet_operator_and_implicit_constructor() {
     B b;
     AA aa(1);
- boost::conversion::mca(aa)=b;
+ mca(aa)=b;
 }
 
 void assign_to_with_assignemet_operator_and_conversion_operator() {
@@ -117,22 +186,23 @@
     {
     C c;
     CC cc(1);
- boost::conversion::assign_to(cc,c);
+ assign_to(cc,c);
     }
 }
 
 void mca_with_assignemet_operator_and_conversion_operator() {
     C c;
     CC cc(1);
- boost::conversion::mca(cc)=c;
+ mca(cc)=c;
 }
 
 
 int main( )
 {
   convert_to_with_implicit_constructor();
- convert_to_with_explicit_constructor();
- convert_to_with_conversion_operator();
+ explicit_convert_to_with_explicit_constructor();
+ convert_to_with_implicit_conversion_operator();
+ explicit_convert_to_with_explicit_conversion_operator();
   assign_to_with_assignemet_operator();
   assign_to_with_assignemet_operator_and_implicit_constructor();
   assign_to_with_assignemet_operator_and_conversion_operator();

Modified: sandbox/conversion/libs/conversion_ext/test/pair.cpp
==============================================================================
--- sandbox/conversion/libs/conversion_ext/test/pair.cpp (original)
+++ sandbox/conversion/libs/conversion_ext/test/pair.cpp 2011-06-13 13:21:15 EDT (Mon, 13 Jun 2011)
@@ -15,6 +15,11 @@
 #include <boost/detail/lightweight_test.hpp>
 #include "helper.hpp"
 #include <boost/static_assert.hpp>
+#include <boost/conversion/type_traits/is_convertible.hpp>
+#include <boost/conversion/type_traits/is_constructible.hpp>
+#include <boost/conversion/type_traits/is_explicitly_convertible.hpp>
+#include <boost/conversion/type_traits/is_assignable.hpp>
+#include <boost/conversion/type_traits/is_extrinsic_convertible.hpp>
 
 using namespace boost;
 
@@ -24,6 +29,7 @@
 BOOST_STATIC_ASSERT(( boost::is_extrinsic_convertible<B2, A2>::value));
 BOOST_STATIC_ASSERT(( !boost::is_constructible<std::pair<A1,A2>, std::pair<B1,B2> >::value));
 BOOST_STATIC_ASSERT(( !boost::is_explicitly_convertible<std::pair<B1,B2>, std::pair<A1,A2> >::value));
+BOOST_STATIC_ASSERT(( !boost::is_convertible<std::pair<B1,B2>, std::pair<A1,A2> >::value));
 
 BOOST_STATIC_ASSERT(( !boost::is_assignable<B1, A1>::value));
 BOOST_STATIC_ASSERT(( !boost::is_assignable<B2, A2>::value));


Boost-Commit list run by bdawes at acm.org, david.abrahams at rcn.com, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk