From a0e11004218e635136e71b8eebb55fed45f2040c Mon Sep 17 00:00:00 2001 From: Glen Fernandes Date: Mon, 29 Apr 2019 00:23:59 -0400 Subject: [PATCH] Add noinit_adapt() free function utility --- doc/noinit_adaptor.qbk | 12 ++++- include/boost/core/noinit_adaptor.hpp | 7 +++ test/noinit_adaptor_test.cpp | 67 ++++++++++++--------------- 3 files changed, 47 insertions(+), 39 deletions(-) diff --git a/doc/noinit_adaptor.qbk b/doc/noinit_adaptor.qbk index f622f58..585508a 100644 --- a/doc/noinit_adaptor.qbk +++ b/doc/noinit_adaptor.qbk @@ -34,8 +34,7 @@ initialization of elements of a trivial type, which are later assigned values. int main() { - std::vector > > v(5); + std::vector > > v(5); std::iota(v.begin(), v.end(), 1); } ``` @@ -136,6 +135,15 @@ const noinit_adaptor& rhs) noexcept;`] [endsect] +[section Free functions] + +[variablelist +[[`template noinit_adaptor noinit_adapt(const A& a) noexcept;`] +[[variablelist +[[Returns][`noinit_adaptor(a)`.]]]]]] + +[endsect] + [endsect] [endsect] diff --git a/include/boost/core/noinit_adaptor.hpp b/include/boost/core/noinit_adaptor.hpp index 959da95..eb92102 100644 --- a/include/boost/core/noinit_adaptor.hpp +++ b/include/boost/core/noinit_adaptor.hpp @@ -91,6 +91,13 @@ operator!=(const noinit_adaptor& lhs, return !(lhs == rhs); } +template +inline noinit_adaptor +noinit_adapt(const A& a) BOOST_NOEXCEPT +{ + return noinit_adaptor(a); +} + } /* boost */ #endif diff --git a/test/noinit_adaptor_test.cpp b/test/noinit_adaptor_test.cpp index 12fb941..8f394ea 100644 --- a/test/noinit_adaptor_test.cpp +++ b/test/noinit_adaptor_test.cpp @@ -19,36 +19,36 @@ public: typedef creator other; }; - creator(int* count) - : count_(count) { } + creator(int state) + : state_(state) { } template creator(const creator& other) - : count_(other.count()) { } + : state_(other.state()) { } template void construct(U*, const V&) { - ++(*count_); + BOOST_ERROR("construct"); } template void destroy(U*) { - --(*count_); + BOOST_ERROR("destroy"); } - int* count() const { - return count_; + int state() const { + return state_; } private: - int* count_; + int state_; }; template inline bool operator==(const creator& lhs, const creator& rhs) { - return lhs.count() == rhs.count(); + return lhs.state() == rhs.state(); } template @@ -73,35 +73,28 @@ private: int value_; }; +inline bool +operator==(const type& lhs, const type& rhs) +{ + return lhs.value() == rhs.value(); +} + +template +void test(const A& allocator) +{ + std::vector v(allocator); + v.push_back(1); + BOOST_TEST(v.front() == 1); + v.clear(); + v.resize(5); + v.front() = 1; +} + int main() { - { - int c = 0; - std::vector > > v(&c); - BOOST_TEST(c == 0); - v.push_back(1); - BOOST_TEST(v.front() == 1); - v.push_back(2); - BOOST_TEST(c == 0); - v.clear(); - BOOST_TEST(c == 0); - v.resize(5); - BOOST_TEST(c == 0); - v.front() = 1; - } - { - int c = 0; - std::vector > > v(&c); - BOOST_TEST(c == 0); - v.push_back(1); - BOOST_TEST(v.front().value() == 1); - v.push_back(2); - BOOST_TEST(c == 0); - v.clear(); - BOOST_TEST(c == 0); - v.resize(5); - BOOST_TEST(c == 0); - v.front() = 1; - } + test(boost::noinit_adaptor >(1)); + test(boost::noinit_adaptor >(2)); + test(boost::noinit_adapt(creator(3))); + test(boost::noinit_adapt(creator(4))); return boost::report_errors(); }