summaryrefslogtreecommitdiffstats
path: root/src/boost/libs/pool/test/track_allocator.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/boost/libs/pool/test/track_allocator.hpp')
-rw-r--r--src/boost/libs/pool/test/track_allocator.hpp104
1 files changed, 104 insertions, 0 deletions
diff --git a/src/boost/libs/pool/test/track_allocator.hpp b/src/boost/libs/pool/test/track_allocator.hpp
new file mode 100644
index 00000000..ed989f04
--- /dev/null
+++ b/src/boost/libs/pool/test/track_allocator.hpp
@@ -0,0 +1,104 @@
+/* Copyright (C) 2000, 2001 Stephen Cleary
+* Copyright (C) 2011 Kwan Ting Chan
+*
+* Use, modification and distribution is subject to the
+* Boost Software License, Version 1.0. (See accompanying
+* file LICENSE_1_0.txt or http://www.boost.org/LICENSE_1_0.txt)
+*/
+
+#ifndef BOOST_POOL_TRACK_ALLOCATOR_HPP
+#define BOOST_POOL_TRACK_ALLOCATOR_HPP
+
+#include <boost/detail/lightweight_test.hpp>
+
+#include <new>
+#include <set>
+#include <stdexcept>
+
+#include <cstddef>
+
+// Each "tester" object below checks into and out of the "cdtor_checker",
+// which will check for any problems related to the construction/destruction of
+// "tester" objects.
+class cdtor_checker
+{
+private:
+ // Each constructed object registers its "this" pointer into "objs"
+ std::set<void*> objs;
+
+public:
+ // True iff all objects that have checked in have checked out
+ bool ok() const { return objs.empty(); }
+
+ ~cdtor_checker()
+ {
+ BOOST_TEST(ok());
+ }
+
+ void check_in(void * const This)
+ {
+ BOOST_TEST(objs.find(This) == objs.end());
+ objs.insert(This);
+ }
+
+ void check_out(void * const This)
+ {
+ BOOST_TEST(objs.find(This) != objs.end());
+ objs.erase(This);
+ }
+};
+static cdtor_checker mem;
+
+struct tester
+{
+ tester(bool throw_except = false)
+ {
+ if(throw_except)
+ {
+ throw std::logic_error("Deliberate constructor exception");
+ }
+
+ mem.check_in(this);
+ }
+
+ tester(const tester &)
+ {
+ mem.check_in(this);
+ }
+
+ ~tester()
+ {
+ mem.check_out(this);
+ }
+};
+
+// Allocator that registers alloc/dealloc to/from the system memory
+struct track_allocator
+{
+ typedef std::size_t size_type;
+ typedef std::ptrdiff_t difference_type;
+
+ static std::set<char*> allocated_blocks;
+
+ static char* malloc(const size_type bytes)
+ {
+ char* const ret = new (std::nothrow) char[bytes];
+ allocated_blocks.insert(ret);
+ return ret;
+ }
+
+ static void free(char* const block)
+ {
+ BOOST_TEST(allocated_blocks.find(block) != allocated_blocks.end());
+ allocated_blocks.erase(block);
+ delete [] block;
+ }
+
+ static bool ok()
+ {
+ return allocated_blocks.empty();
+ }
+};
+std::set<char*> track_allocator::allocated_blocks;
+
+#endif // BOOST_POOL_TRACK_ALLOCATOR_HPP