libcarla/include/system/boost/json/detail/stack.hpp

100 lines
1.8 KiB
C++
Raw Permalink Normal View History

2024-10-18 13:19:59 +08:00
//
// 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