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