Coverage Report

Created: 2026-11-12 07:18

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/boost/boost/json/detail/impl/stack.ipp
Line
Count
Source
1
//
2
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
3
//
4
// Distributed under the Boost Software License, Version 1.0. (See accompanying
5
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
6
//
7
// Official repository: https://github.com/boostorg/json
8
//
9
10
#ifndef BOOST_JSON_DETAIL_IMPL_STACK_IPP
11
#define BOOST_JSON_DETAIL_IMPL_STACK_IPP
12
13
#include <boost/json/detail/stack.hpp>
14
15
namespace boost {
16
namespace json {
17
namespace detail {
18
19
stack::non_trivial<>*
20
stack::non_trivial<>::destroy() noexcept
21
0
{
22
0
    non_trivial* const result = next;
23
0
    rel(this, nullptr);
24
0
    return result;
25
0
}
26
27
stack::non_trivial<>*
28
stack::non_trivial<>::relocate(void* dst) noexcept
29
0
{
30
0
    return rel(this, dst);
31
0
}
32
33
34
stack::
35
~stack()
36
47.3k
{
37
47.3k
    clear();
38
47.3k
    if(base_ != buf_)
39
11.0k
        sp_->deallocate(
40
11.0k
            base_, cap_);
41
47.3k
}
42
43
stack::
44
stack(
45
    storage_ptr sp,
46
    unsigned char* buf,
47
    std::size_t buf_size) noexcept
48
7.41k
    : sp_(std::move(sp))
49
7.41k
    , cap_(buf_size)
50
7.41k
    , base_(buf)
51
7.41k
    , buf_(buf)
52
7.41k
{
53
7.41k
}
54
55
void
56
stack::
57
clear() noexcept
58
93.1k
{
59
93.1k
    while(head_)
60
0
        head_ = head_->destroy();
61
93.1k
    size_ = 0;
62
93.1k
}
63
64
void
65
stack::
66
reserve_impl(std::size_t n)
67
13.7k
{
68
    // caller checks this
69
13.7k
    BOOST_ASSERT(n > cap_);
70
71
13.7k
    auto const base = static_cast<unsigned char*>( sp_->allocate(n) );
72
13.7k
    if(base_)
73
2.77k
    {
74
        // copy trivials
75
2.77k
        std::memcpy(base, base_, size_);
76
77
        // copy non-trivials
78
2.77k
        non_trivial<>* src = head_;
79
2.77k
        non_trivial<>** prev = &head_;
80
2.77k
        while(src)
81
0
        {
82
0
            std::size_t const buf_offset =
83
0
                reinterpret_cast<unsigned char*>(src) - base_;
84
0
            non_trivial<>* dest = src->relocate(base + buf_offset);
85
0
            *prev = dest;
86
0
            prev = &dest->next;
87
0
            src = dest->next;
88
0
        }
89
90
2.77k
        if(base_ != buf_)
91
2.69k
            sp_->deallocate(base_, cap_);
92
2.77k
    }
93
13.7k
    base_ = base;
94
13.7k
    cap_ = n;
95
13.7k
}
96
97
} // detail
98
} // namespace json
99
} // namespace boost
100
101
#endif