//===----------------------------------------------------------------------===// // // The LLVM Compiler Infrastructure // // This file is dual licensed under the MIT and the University of Illinois Open // Source Licenses. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// // // class function // template function(allocator_arg_t, const A&, F); #include #include #include "min_allocator.h" #include "test_allocator.h" #include "count_new.hpp" #include "../function_types.h" class DummyClass {}; template void test_FunctionObject(AllocType& alloc) { assert(globalMemCounter.checkOutstandingNewEq(0)); { FunctionObject target; assert(FunctionObject::count == 1); assert(globalMemCounter.checkOutstandingNewEq(0)); std::function f2(std::allocator_arg, alloc, target); assert(FunctionObject::count == 2); assert(globalMemCounter.checkOutstandingNewEq(1)); assert(f2.template target()); assert(f2.template target() == 0); assert(f2.template target() == 0); } assert(FunctionObject::count == 0); assert(globalMemCounter.checkOutstandingNewEq(0)); } template void test_FreeFunction(AllocType& alloc) { assert(globalMemCounter.checkOutstandingNewEq(0)); { FuncType* target = &FreeFunction; assert(globalMemCounter.checkOutstandingNewEq(0)); std::function f2(std::allocator_arg, alloc, target); assert(globalMemCounter.checkOutstandingNewEq(0)); assert(f2.template target()); assert(*f2.template target() == target); assert(f2.template target() == 0); assert(f2.template target() == 0); } assert(globalMemCounter.checkOutstandingNewEq(0)); } template void test_MemFunClass(AllocType& alloc) { assert(globalMemCounter.checkOutstandingNewEq(0)); { TargetType target = &MemFunClass::foo; assert(globalMemCounter.checkOutstandingNewEq(0)); std::function f2(std::allocator_arg, alloc, target); assert(globalMemCounter.checkOutstandingNewEq(0)); assert(f2.template target()); assert(*f2.template target() == target); assert(f2.template target() == 0); } assert(globalMemCounter.checkOutstandingNewEq(0)); } template void test_for_alloc(Alloc& alloc) { test_FunctionObject(alloc); test_FunctionObject(alloc); test_FunctionObject(alloc); test_FunctionObject(alloc); test_FreeFunction(alloc); test_FreeFunction(alloc); test_FreeFunction(alloc); test_FreeFunction(alloc); test_MemFunClass(alloc); test_MemFunClass(alloc); test_MemFunClass(alloc); } int main() { { bare_allocator bare_alloc; test_for_alloc(bare_alloc); } { non_default_test_allocator non_default_alloc(42); test_for_alloc(non_default_alloc); } }