|
Boost-Commit : |
From: steven_at_[hidden]
Date: 2007-11-19 10:53:49
Author: steven_watanabe
Date: 2007-11-19 10:53:48 EST (Mon, 19 Nov 2007)
New Revision: 41229
URL: http://svn.boost.org/trac/boost/changeset/41229
Log:
Fixed more problems with forced_return
Added:
sandbox/switch/libs/switch/test/test_odr1.cpp (contents, props changed)
sandbox/switch/libs/switch/test/test_odr2.cpp (contents, props changed)
Text files modified:
sandbox/switch/boost/switch.hpp | 11 +++++++++--
sandbox/switch/libs/switch/test/Jamfile.v2 | 3 ++-
sandbox/switch/libs/switch/test/test_switch.cpp | 26 ++++++++++++++++++++++----
3 files changed, 33 insertions(+), 7 deletions(-)
Modified: sandbox/switch/boost/switch.hpp
==============================================================================
--- sandbox/switch/boost/switch.hpp (original)
+++ sandbox/switch/boost/switch.hpp 2007-11-19 10:53:48 EST (Mon, 19 Nov 2007)
@@ -20,6 +20,7 @@
#include <boost/preprocessor/iteration/local.hpp>
#include <boost/mpl/size.hpp>
#include <boost/mpl/at.hpp>
+#include <boost/type_traits/remove_reference.hpp>
#ifndef BOOST_SWITCH_LIMIT
#define BOOST_SWITCH_LIMIT 50
@@ -50,13 +51,19 @@
// default is supplied.
template<class R>
-R forced_return(R* r = 0) {
+inline R forced_return(typename boost::remove_reference<R>::type* r = 0) {
return(*r);
}
// Thanks to Stjepan Rajko for catching this.
template<>
-void forced_return<void>(void*) {}
+inline void forced_return<void>(void*) {}
+template<>
+inline const void forced_return<const void>(const void*) {}
+template<>
+inline volatile void forced_return<volatile void>(volatile void*) {}
+template<>
+inline const volatile void forced_return<const volatile void>(const volatile void*) {}
template<class R>
struct throw_exception {
Modified: sandbox/switch/libs/switch/test/Jamfile.v2
==============================================================================
--- sandbox/switch/libs/switch/test/Jamfile.v2 (original)
+++ sandbox/switch/libs/switch/test/Jamfile.v2 2007-11-19 10:53:48 EST (Mon, 19 Nov 2007)
@@ -10,7 +10,7 @@
import testing ;
project switch_test : :
- requirements <include>../../.. <warnings>all
+ requirements <include>../../.. <include>$(BOOST_ROOT) <warnings>all
;
@@ -18,5 +18,6 @@
test-suite switch_:
:
[ run test_switch.cpp $(BOOST_ROOT)/libs/test/build//boost_unit_test_framework : : : : ]
+ [ link test_odr1.cpp test_odr2.cpp ]
;
}
Added: sandbox/switch/libs/switch/test/test_odr1.cpp
==============================================================================
--- (empty file)
+++ sandbox/switch/libs/switch/test/test_odr1.cpp 2007-11-19 10:53:48 EST (Mon, 19 Nov 2007)
@@ -0,0 +1,12 @@
+// test_odr1.cpp
+//
+// Copyright (c) 2007
+// Steven Watanabe
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/switch.hpp>
+
+int main() {}
Added: sandbox/switch/libs/switch/test/test_odr2.cpp
==============================================================================
--- (empty file)
+++ sandbox/switch/libs/switch/test/test_odr2.cpp 2007-11-19 10:53:48 EST (Mon, 19 Nov 2007)
@@ -0,0 +1,10 @@
+// test_odr1.cpp
+//
+// Copyright (c) 2007
+// Steven Watanabe
+//
+// Distributed under the Boost Software License, Version 1.0. (See
+// accompanying file LICENSE_1_0.txt or copy at
+// http://www.boost.org/LICENSE_1_0.txt)
+
+#include <boost/switch.hpp>
Modified: sandbox/switch/libs/switch/test/test_switch.cpp
==============================================================================
--- sandbox/switch/libs/switch/test/test_switch.cpp (original)
+++ sandbox/switch/libs/switch/test/test_switch.cpp 2007-11-19 10:53:48 EST (Mon, 19 Nov 2007)
@@ -34,20 +34,31 @@
struct limit_test {
typedef int result_type;
template<class Index>
- int operator()(Index) {
+ int operator()(Index) const {
return(-Index::value);
}
};
typedef boost::mpl::range_c<int, 0, BOOST_SWITCH_LIMIT> limit_range;
const int limit_value = BOOST_SWITCH_LIMIT - 1;
+ template<class T>
struct void_return {
- typedef void result_type;
+ typedef T result_type;
template<class Index>
- void operator()(Index) {
+ T operator()(Index) const {
// Do Nothing.
}
};
+
+ int test_int;
+
+ struct return_reference {
+ typedef int& result_type;
+ template<class Index>
+ int& operator()(Index) const {
+ return(test_int);
+ }
+ };
}
BOOST_AUTO_TEST_CASE(without_default) {
@@ -109,5 +120,12 @@
}
BOOST_AUTO_TEST_CASE(test_void) {
- boost::switch_<test_range>(0, void_return());
+ boost::switch_<test_range>(0, void_return<void>());
+ boost::switch_<test_range>(0, void_return<const void>());
+ boost::switch_<test_range>(0, void_return<volatile void>());
+ boost::switch_<test_range>(0, void_return<const volatile void>());
+}
+
+BOOST_AUTO_TEST_CASE(test_reference) {
+ boost::switch_<test_range>(0, return_reference());
}
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