diff options
| -rw-r--r-- | libadhocutil/lazyPointer.h | 26 | ||||
| -rw-r--r-- | libadhocutil/unittests/testLazyPointer.cpp | 16 | 
2 files changed, 22 insertions, 20 deletions
diff --git a/libadhocutil/lazyPointer.h b/libadhocutil/lazyPointer.h index bcc5217..71ad29a 100644 --- a/libadhocutil/lazyPointer.h +++ b/libadhocutil/lazyPointer.h @@ -1,10 +1,9 @@  #ifndef ADHOCUTIL_LAZYPOINTER_H  #define ADHOCUTIL_LAZYPOINTER_H -#include <boost/function.hpp> -#include <boost/variant.hpp> -#include <boost/intrusive_ptr.hpp> -#include <boost/get_pointer.hpp> +#include <functional> +#include <variant> +#include <memory>  #include <ostream>  namespace AdHoc { @@ -16,14 +15,14 @@ namespace AdHoc {   * an attempt to dereference the pointer. All such operations will call   * this factory function as required prior to evaluating the pointer's value.   */ -template <typename T, typename P = boost::intrusive_ptr<T>> +template <typename T, typename P = std::shared_ptr<T>>  class LazyPointer {  	public:  		/// @cond  		typedef T element_type;  		typedef P pointer_type; -		typedef boost::function0<P> Factory; -		typedef boost::variant<P, Factory> Source; +		typedef std::function<P()> Factory; +		typedef std::variant<P, Factory> Source;  		/// @endcond  		/** Construct pointer with a factory function. */ @@ -70,18 +69,23 @@ class LazyPointer {  		T * get() const  		{ -			return boost::get_pointer(deref()); +			if constexpr (std::is_pointer<P>::value) { +				return deref(); +			} +			else { +				return deref().get(); +			}  		}  		P deref() const  		{ -			if (Factory * f = boost::get<Factory>(&source)) { +			if (Factory * f = std::get_if<Factory>(&source)) {  				P p = (*f)();  				source = p;  				return p;  			}  			else { -				return boost::get<P>(source); +				return std::get<P>(source);  			}  		} @@ -128,7 +132,7 @@ class LazyPointer {  		/** Does the lazy pointer have a value? (as opposed to a factory). */  		bool hasValue() const  		{ -			return boost::get<P>(&source); +			return std::get_if<P>(&source);  		}  	private: diff --git a/libadhocutil/unittests/testLazyPointer.cpp b/libadhocutil/unittests/testLazyPointer.cpp index 4ecdd0f..a747f17 100644 --- a/libadhocutil/unittests/testLazyPointer.cpp +++ b/libadhocutil/unittests/testLazyPointer.cpp @@ -1,13 +1,11 @@  #define BOOST_TEST_MODULE LazyPointer  #include <boost/test/unit_test.hpp> -#include <boost/bind.hpp> -#include "intrusivePtrBase.h"  #include "lazyPointer.h"  using namespace AdHoc; -class Test : public IntrusivePtrBase { +class Test {  	public:  		Test(int v) :  			val(v) @@ -23,19 +21,19 @@ static  TestLazyPointer::pointer_type  factory()  { -	return new Test(3); +	return std::make_shared<Test>(3);  }  static  TestLazyPointer::pointer_type  paramFactory(const std::string & str)  { -	return new Test(str.length()); +	return std::make_shared<Test>(str.length());  }  BOOST_AUTO_TEST_CASE ( islazy )  { -	TestLazyPointer p(boost::bind(&factory)); +	TestLazyPointer p(std::bind(&factory));  	BOOST_REQUIRE_EQUAL(false, p.hasValue());  	Test * t = p.get();  	BOOST_REQUIRE(t); @@ -65,7 +63,7 @@ BOOST_AUTO_TEST_CASE ( reset )  	p = nullptr;  	BOOST_REQUIRE_EQUAL(true, p.hasValue());  	BOOST_REQUIRE_EQUAL(true, !p); -	p = boost::bind(&factory); +	p = std::bind(&factory);  	BOOST_REQUIRE_EQUAL(false, p.hasValue());  	p.get();  	BOOST_REQUIRE_EQUAL(true, p.hasValue()); @@ -74,7 +72,7 @@ BOOST_AUTO_TEST_CASE ( reset )  BOOST_AUTO_TEST_CASE ( nondefault )  { -	TestLazyPointer p(boost::bind(¶mFactory, "some string")); +	TestLazyPointer p(std::bind(¶mFactory, "some string"));  	BOOST_REQUIRE_EQUAL(false, p.hasValue());  	BOOST_REQUIRE_EQUAL(11, (*p).val);  	BOOST_REQUIRE_EQUAL(true, p.hasValue()); @@ -108,7 +106,7 @@ rawFactory(const std::string & s)  BOOST_AUTO_TEST_CASE( rawPointerFactory )  { -	RawLazyPointer value(boost::bind(&rawFactory, std::string("four"))); +	RawLazyPointer value(std::bind(&rawFactory, std::string("four")));  	BOOST_REQUIRE(!value.hasValue());  	BOOST_REQUIRE_EQUAL(*value, 4);  	BOOST_REQUIRE(value.hasValue());  | 
