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