100 lines
1.8 KiB
C++
100 lines
1.8 KiB
C++
|
//
|
||
|
// Copyright (c) 2019 Vinnie Falco (vinnie.falco@gmail.com)
|
||
|
//
|
||
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
||
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
||
|
//
|
||
|
// Official repository: https://github.com/boostorg/json
|
||
|
//
|
||
|
|
||
|
#ifndef BOOST_JSON_DETAIL_STACK_HPP
|
||
|
#define BOOST_JSON_DETAIL_STACK_HPP
|
||
|
|
||
|
#include <boost/json/detail/config.hpp>
|
||
|
#include <boost/json/storage_ptr.hpp>
|
||
|
#include <cstring>
|
||
|
|
||
|
BOOST_JSON_NS_BEGIN
|
||
|
namespace detail {
|
||
|
|
||
|
class stack
|
||
|
{
|
||
|
storage_ptr sp_;
|
||
|
std::size_t cap_ = 0;
|
||
|
std::size_t size_ = 0;
|
||
|
char* buf_ = nullptr;
|
||
|
|
||
|
public:
|
||
|
BOOST_JSON_DECL
|
||
|
~stack();
|
||
|
|
||
|
bool
|
||
|
empty() const noexcept
|
||
|
{
|
||
|
return size_ == 0;
|
||
|
}
|
||
|
|
||
|
void
|
||
|
clear() noexcept
|
||
|
{
|
||
|
size_ = 0;
|
||
|
}
|
||
|
|
||
|
BOOST_JSON_DECL
|
||
|
void
|
||
|
reserve(std::size_t n);
|
||
|
|
||
|
template<class T>
|
||
|
void
|
||
|
push(T const& t)
|
||
|
{
|
||
|
auto const n = sizeof(T);
|
||
|
// If this assert goes off, it
|
||
|
// means the calling code did not
|
||
|
// reserve enough to prevent a
|
||
|
// reallocation.
|
||
|
//BOOST_ASSERT(cap_ >= size_ + n);
|
||
|
reserve(size_ + n);
|
||
|
std::memcpy(
|
||
|
buf_ + size_, &t, n);
|
||
|
size_ += n;
|
||
|
}
|
||
|
|
||
|
template<class T>
|
||
|
void
|
||
|
push_unchecked(T const& t)
|
||
|
{
|
||
|
auto const n = sizeof(T);
|
||
|
BOOST_ASSERT(size_ + n <= cap_);
|
||
|
std::memcpy(
|
||
|
buf_ + size_, &t, n);
|
||
|
size_ += n;
|
||
|
}
|
||
|
|
||
|
template<class T>
|
||
|
void
|
||
|
peek(T& t)
|
||
|
{
|
||
|
auto const n = sizeof(T);
|
||
|
BOOST_ASSERT(size_ >= n);
|
||
|
std::memcpy(&t,
|
||
|
buf_ + size_ - n, n);
|
||
|
}
|
||
|
|
||
|
template<class T>
|
||
|
void
|
||
|
pop(T& t)
|
||
|
{
|
||
|
auto const n = sizeof(T);
|
||
|
BOOST_ASSERT(size_ >= n);
|
||
|
size_ -= n;
|
||
|
std::memcpy(
|
||
|
&t, buf_ + size_, n);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
} // detail
|
||
|
BOOST_JSON_NS_END
|
||
|
|
||
|
#endif
|