5#include <llvm/ADT/STLExtras.h>
6#include <llvm/ADT/StringMap.h>
11template <
typename T>
class ScopeContainerGuard;
14 std::deque<llvm::StringMap<T>> m_scopes{};
17 [[nodiscard]]
auto all_scopes() const noexcept -> const auto& {
return m_scopes; }
18 [[nodiscard]]
auto last_scope() const noexcept -> const auto& {
return m_scopes.back(); }
19 [[nodiscard]]
auto last_scope() noexcept -> auto& {
return m_scopes.back(); }
24 auto add(std::string_view key, T
object)
noexcept {
return m_scopes.back().try_emplace(key, move(
object)); }
25 auto add_to_front(std::string_view key, T
object)
noexcept {
return m_scopes.front().try_emplace(key, move(
object)); }
27 for (
const auto& scope : llvm::reverse(m_scopes))
28 if (
auto lookup = scope.find(key); lookup != scope.end())
29 return &lookup->getValue();
33 for (
auto& scope : llvm::reverse(m_scopes))
34 if (
auto lookup = scope.find(key); lookup != scope.end())
35 return &lookup->getValue();
38 void clear() noexcept { m_scopes.clear(); }
39 auto size() noexcept ->
size_t {
return m_scopes.size(); }
48 : m_container(container), m_prev_size(prev_size) {}
50 YUME_ASSERT(m_container.
size() == m_prev_size,
"Cannot pop scope when scope is in invalid state");
61 return {*
this, size()};
ScopeContainerGuard(const ScopeContainerGuard< T > &)=delete
ScopeContainerGuard(ScopeContainer< T > &container, size_t prev_size)
ScopeContainerGuard(ScopeContainerGuard< T > &&)=delete
auto operator=(ScopeContainerGuard< T > &&)=delete
auto operator=(const ScopeContainerGuard< T > &)=delete
void push_scope() noexcept
auto last_scope() noexcept -> auto &
auto add(std::string_view key, T object) noexcept
auto push_scope_guarded() noexcept -> ScopeContainerGuard< T >
auto find(std::string_view key) const noexcept -> nullable< const T * >
void pop_scope() noexcept
auto last_scope() const noexcept -> const auto &
auto add_to_front(std::string_view key, T object) noexcept
auto size() noexcept -> size_t
auto all_scopes() const noexcept -> const auto &
auto find(std::string_view key) noexcept -> nullable< T * >
#define YUME_ASSERT(assertion, message)