From 0be943c2f6a622242b44b043660362007445d169 Mon Sep 17 00:00:00 2001 From: Fernando Cacciola Date: Fri, 3 Feb 2006 21:39:21 +0000 Subject: [PATCH] Added simple operators << and >> to optional<> [SVN r32533] --- include/boost/optional/optional_io.hpp | 64 ++++++++++++++++++ test/Jamfile | 1 + test/optional_test_io.cpp | 89 ++++++++++++++++++++++++++ 3 files changed, 154 insertions(+) create mode 100644 include/boost/optional/optional_io.hpp create mode 100644 test/optional_test_io.cpp diff --git a/include/boost/optional/optional_io.hpp b/include/boost/optional/optional_io.hpp new file mode 100644 index 0000000..cc55e7b --- /dev/null +++ b/include/boost/optional/optional_io.hpp @@ -0,0 +1,64 @@ +// Copyright (C) 2005, Fernando Luis Cacciola Carballal. +// +// Use, modification, and distribution is subject to 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) +// +// See http://www.boost.org/lib/optional for documentation. +// +// You are welcome to contact the author at: +// fernando_cacciola@hotmail.com +// +#ifndef BOOST_OPTIONAL_OPTIONAL_IO_FLC_19NOV2002_HPP +#define BOOST_OPTIONAL_OPTIONAL_IO_FLC_19NOV2002_HPP + +#include +#include + + +#include "boost/optional/optional.hpp" +#include "boost/utility/value_init.hpp" + +namespace boost +{ + +template +inline +std::basic_ostream& +operator<<(std::basic_ostream& out, optional const& v) +{ + if ( out.good() ) + { + if ( !v ) + out << "--" ; + else out << ' ' << *v ; + } + + return out; +} + +template +inline +std::basic_istream& +operator>>(std::basic_istream& in, optional& v) +{ + if ( in.good() ) + { + int d = in.get(); + if ( d == ' ' ) + { + T x ; + in >> x; + v = x ; + } + else + v = optional() ; + } + + return in; +} + +} // namespace boost + +#endif + diff --git a/test/Jamfile b/test/Jamfile index 841647d..1f8b84a 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -22,6 +22,7 @@ DEPENDS all : test ; [ run optional_test_tie.cpp ] [ run optional_test_ref.cpp ] [ run optional_test_inplace.cpp ] + [ run optional_test_io.cpp ] [ compile-fail optional_test_fail1.cpp ] [ compile-fail optional_test_fail2.cpp ] [ compile-fail optional_test_fail3a.cpp ] diff --git a/test/optional_test_io.cpp b/test/optional_test_io.cpp new file mode 100644 index 0000000..13e8a5d --- /dev/null +++ b/test/optional_test_io.cpp @@ -0,0 +1,89 @@ +// Copyright (C) 2003, Fernando Luis Cacciola Carballal. +// +// Use, modification, and distribution is subject to 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) +// +// See http://www.boost.org/lib/optional for documentation. +// +// You are welcome to contact the author at: +// fernando_cacciola@hotmail.com +// +#include +#include +#include + +#define BOOST_ENABLE_ASSERT_HANDLER + +#include "boost/optional/optional.hpp" +#include "boost/optional/optional_io.hpp" +#include "boost/none.hpp" + +#include "boost/test/minimal.hpp" + +#ifdef ENABLE_TRACE +#define TRACE(msg) std::cout << msg << std::endl ; +#else +#define TRACE(msg) +#endif + +namespace boost { + +void assertion_failed (char const * expr, char const * func, char const * file, long ) +{ + using std::string ; + string msg = string("Boost assertion failure for \"") + + string(expr) + + string("\" at file \"") + + string(file) + + string("\" function \"") + + string(func) + + string("\"") ; + + TRACE(msg); + + throw std::logic_error(msg); +} + +} + +using namespace std ; +using namespace boost ; + +template +void test2( Opt o, Opt buff ) +{ + stringstream s ; + + s << o ; + s >> buff ; + + BOOST_ASSERT( buff == o ) ; +} + + +template +void test( T v, T w ) +{ + test2( make_optional(v), optional ()); + test2( make_optional(v), make_optional(w)); + test2( optional () , optional ()); + test2( optional () , make_optional(w)); +} + +int test_main( int, char* [] ) +{ + try + { + test(1,2); + test(string("hello"),string("buffer")); + test(string(""),string("buffer")); + } + catch ( ... ) + { + BOOST_ERROR("Unexpected Exception caught!"); + } + + return 0; +} +