101 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			101 lines
		
	
	
		
			2.4 KiB
		
	
	
	
		
			C++
		
	
	
	
//===----------------------------------------------------------------------===//
 | 
						|
//
 | 
						|
//                     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.
 | 
						|
//
 | 
						|
//===----------------------------------------------------------------------===//
 | 
						|
 | 
						|
// UNSUPPORTED: c++98, c++03, c++11
 | 
						|
 | 
						|
// <experimental/any>
 | 
						|
 | 
						|
// any(any const &);
 | 
						|
 | 
						|
#include <experimental/any>
 | 
						|
#include <cassert>
 | 
						|
 | 
						|
#include "any_helpers.h"
 | 
						|
#include "count_new.hpp"
 | 
						|
#include "test_macros.h"
 | 
						|
 | 
						|
using std::experimental::any;
 | 
						|
using std::experimental::any_cast;
 | 
						|
 | 
						|
template <class Type>
 | 
						|
void test_copy_throws() {
 | 
						|
#if !defined(TEST_HAS_NO_EXCEPTIONS)
 | 
						|
    assert(Type::count == 0);
 | 
						|
    {
 | 
						|
        any const a((Type(42)));
 | 
						|
        assert(Type::count == 1);
 | 
						|
        try {
 | 
						|
            any const a2(a);
 | 
						|
            assert(false);
 | 
						|
        } catch (my_any_exception const &) {
 | 
						|
            // do nothing
 | 
						|
        } catch (...) {
 | 
						|
            assert(false);
 | 
						|
        }
 | 
						|
        assert(Type::count == 1);
 | 
						|
        assertContains<Type>(a, 42);
 | 
						|
    }
 | 
						|
    assert(Type::count == 0);
 | 
						|
#endif
 | 
						|
}
 | 
						|
 | 
						|
void test_copy_empty() {
 | 
						|
    DisableAllocationGuard g; ((void)g); // No allocations should occur.
 | 
						|
    any a1;
 | 
						|
    any a2(a1);
 | 
						|
 | 
						|
    assertEmpty(a1);
 | 
						|
    assertEmpty(a2);
 | 
						|
}
 | 
						|
 | 
						|
template <class Type>
 | 
						|
void test_copy()
 | 
						|
{
 | 
						|
    // Copying small types should not perform any allocations.
 | 
						|
    DisableAllocationGuard g(isSmallType<Type>()); ((void)g);
 | 
						|
    assert(Type::count == 0);
 | 
						|
    Type::reset();
 | 
						|
    {
 | 
						|
        any a((Type(42)));
 | 
						|
        assert(Type::count == 1);
 | 
						|
        assert(Type::copied == 0);
 | 
						|
 | 
						|
        any a2(a);
 | 
						|
 | 
						|
        assert(Type::copied == 1);
 | 
						|
        assert(Type::count == 2);
 | 
						|
        assertContains<Type>(a, 42);
 | 
						|
        assertContains<Type>(a, 42);
 | 
						|
 | 
						|
        // Modify a and check that a2 is unchanged
 | 
						|
        modifyValue<Type>(a, -1);
 | 
						|
        assertContains<Type>(a, -1);
 | 
						|
        assertContains<Type>(a2, 42);
 | 
						|
 | 
						|
        // modify a2 and check that a is unchanged
 | 
						|
        modifyValue<Type>(a2, 999);
 | 
						|
        assertContains<Type>(a, -1);
 | 
						|
        assertContains<Type>(a2, 999);
 | 
						|
 | 
						|
        // clear a and check that a2 is unchanged
 | 
						|
        a.clear();
 | 
						|
        assertEmpty(a);
 | 
						|
        assertContains<Type>(a2, 999);
 | 
						|
    }
 | 
						|
    assert(Type::count == 0);
 | 
						|
}
 | 
						|
 | 
						|
int main() {
 | 
						|
    test_copy<small>();
 | 
						|
    test_copy<large>();
 | 
						|
    test_copy_empty();
 | 
						|
    test_copy_throws<small_throws_on_copy>();
 | 
						|
    test_copy_throws<large_throws_on_copy>();
 | 
						|
}
 |