File: quick_allocator_test.cpp

package info (click to toggle)
boost1.90 1.90.0-1
  • links: PTS, VCS
  • area: main
  • in suites:
  • size: 593,120 kB
  • sloc: cpp: 4,190,908; xml: 196,648; python: 34,618; ansic: 23,145; asm: 5,468; sh: 3,774; makefile: 1,161; perl: 1,020; sql: 728; ruby: 676; yacc: 478; java: 77; lisp: 24; csh: 6
file content (99 lines) | stat: -rw-r--r-- 2,945 bytes parent folder | download | duplicates (3)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
// Copyright 2025 Peter Dimov
// Distributed under the Boost Software License, Version 1.0.
// https://www.boost.org/LICENSE_1_0.txt

#include <boost/smart_ptr/detail/quick_allocator.hpp>
#include <boost/core/lightweight_test.hpp>
#include <cstring>

// The interface of quick_allocator has never been documented,
// but in can be inferred from the source code to be
//
// template<class T> struct quick_allocator
// {
//     // allocate memory for an object of type T
//     static void* alloc();
//
//     // deallocate the memory returned from alloc()
//     // if p == 0, no effect
//     static void dealloc( void* p );
//
//     // if n == sizeof(T), returns alloc()
//     // otherwise, allocates a memory block of size n
//     static void* alloc( std::size_t n );
//
//     // deallocate the memory returned from alloc( n )
//     // if p == 0, no effect
//     static void dealloc( void* p, std::size_t n );
//  };

struct X
{
    int data;
};

struct Y: public X
{
    int data2;
};

int main()
{
    using boost::detail::quick_allocator;

    void* p = quick_allocator<Y>::alloc();
    std::memset( p, 0xAA, sizeof(Y) );

    {
        void* p1 = quick_allocator<X>::alloc();
        std::memset( p1, 0xCC, sizeof(X) );

        void* p2 = quick_allocator<X>::alloc();
        std::memset( p2, 0xDD, sizeof(X) );

        BOOST_TEST_NE( p1, p2 );
        BOOST_TEST_EQ( *static_cast<unsigned char*>( p1 ), 0xCC );
        BOOST_TEST_EQ( *static_cast<unsigned char*>( p2 ), 0xDD );

        quick_allocator<X>::dealloc( 0 );
        BOOST_TEST_EQ( *static_cast<unsigned char*>( p1 ), 0xCC );
        BOOST_TEST_EQ( *static_cast<unsigned char*>( p2 ), 0xDD );

        quick_allocator<X>::dealloc( p1 );
        BOOST_TEST_EQ( *static_cast<unsigned char*>( p2 ), 0xDD );

        quick_allocator<X>::dealloc( p2 );
    }

    {
        void* p1 = quick_allocator<X>::alloc( sizeof(X) );
        std::memset( p1, 0xCC, sizeof(X) );

        void* p2 = quick_allocator<X>::alloc( sizeof(Y) );
        std::memset( p2, 0xDD, sizeof(Y) );

        BOOST_TEST_NE( p1, p2 );
        BOOST_TEST_EQ( *static_cast<unsigned char*>( p1 ), 0xCC );
        BOOST_TEST_EQ( *static_cast<unsigned char*>( p2 ), 0xDD );

        quick_allocator<X>::dealloc( 0, sizeof(X) );
        BOOST_TEST_EQ( *static_cast<unsigned char*>( p1 ), 0xCC );
        BOOST_TEST_EQ( *static_cast<unsigned char*>( p2 ), 0xDD );

        quick_allocator<X>::dealloc( p1, sizeof(X) );
        BOOST_TEST_EQ( *static_cast<unsigned char*>( p2 ), 0xDD );

        quick_allocator<X>::dealloc( 0, sizeof(Y) );
        BOOST_TEST_EQ( *static_cast<unsigned char*>( p2 ), 0xDD );

        quick_allocator<X>::dealloc( p2, sizeof(Y) );
    }

    BOOST_TEST_EQ( *static_cast<unsigned char*>( p ), 0xAA );
    quick_allocator<Y>::dealloc( 0 );

    BOOST_TEST_EQ( *static_cast<unsigned char*>( p ), 0xAA );
    quick_allocator<Y>::dealloc( p );

    return boost::report_errors();
}