libcopp 2.3.1
All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Pages
iterator_guard.h
Go to the documentation of this file.
1// Copyright 2025 owent
2// Created by owent on 2017-05-18
3
4#pragma once
5
6#include <iterator>
7
9#include "libcopp/utils/config/libcopp_build_features.h"
10
11LIBCOPP_COPP_NAMESPACE_BEGIN
12namespace util {
13
14template <class ContainerType, bool IsConst = false>
15class LIBCOPP_COPP_API_HEAD_ONLY iterator_guard {
16 public:
17 using iterator_type = typename std::conditional<IsConst, typename ContainerType::const_iterator,
18 typename ContainerType::iterator>::type;
19
20 using reference = typename std::iterator_traits<iterator_type>::reference;
21 using pointer = typename std::iterator_traits<iterator_type>::pointer;
22 using value_type = typename std::iterator_traits<iterator_type>::value_type;
23
24 LIBCOPP_UTIL_FORCEINLINE void set(const ContainerType& owner, iterator_type v) LIBCOPP_MACRO_NOEXCEPT {
25 owner_ = &owner;
26 iter_ = v;
27 }
28
29 LIBCOPP_UTIL_FORCEINLINE void reset(const ContainerType& owner) LIBCOPP_MACRO_NOEXCEPT {
30 owner_ = nullptr;
31 iter_ = owner.end();
32 }
33
34 LIBCOPP_UTIL_FORCEINLINE iterator_type release(const ContainerType& owner) {
35 iterator_type ret = iter_;
36 owner_ = nullptr;
37 iter_ = owner.end();
38
39 return ret;
40 }
41
42 LIBCOPP_UTIL_FORCEINLINE bool valid(const ContainerType& owner) const LIBCOPP_MACRO_NOEXCEPT {
43 if (owner_ != &owner) {
44 return false;
45 }
46
47 return iter_ != owner.end();
48 }
49
50 LIBCOPP_UTIL_FORCEINLINE reference operator*() const LIBCOPP_MACRO_NOEXCEPT { return *iter_; }
51
52 LIBCOPP_UTIL_FORCEINLINE pointer operator->() const LIBCOPP_MACRO_NOEXCEPT { return &(*iter_); }
53
54 LIBCOPP_UTIL_FORCEINLINE iterator_guard() LIBCOPP_MACRO_NOEXCEPT : owner_(nullptr) {}
55
56 private:
57 const ContainerType* owner_;
59};
60
61} // namespace util
62LIBCOPP_COPP_NAMESPACE_END
typename std::conditional< IsConst, typename ContainerType::const_iterator, typename ContainerType::iterator >::type iterator_type
LIBCOPP_UTIL_FORCEINLINE void reset(const ContainerType &owner) LIBCOPP_MACRO_NOEXCEPT
typename std::iterator_traits< iterator_type >::pointer pointer
typename std::iterator_traits< iterator_type >::value_type value_type
const ContainerType * owner_
LIBCOPP_UTIL_FORCEINLINE pointer operator->() const LIBCOPP_MACRO_NOEXCEPT
LIBCOPP_UTIL_FORCEINLINE void set(const ContainerType &owner, iterator_type v) LIBCOPP_MACRO_NOEXCEPT
LIBCOPP_UTIL_FORCEINLINE iterator_guard() LIBCOPP_MACRO_NOEXCEPT
LIBCOPP_UTIL_FORCEINLINE bool valid(const ContainerType &owner) const LIBCOPP_MACRO_NOEXCEPT
LIBCOPP_UTIL_FORCEINLINE reference operator*() const LIBCOPP_MACRO_NOEXCEPT
LIBCOPP_UTIL_FORCEINLINE iterator_type release(const ContainerType &owner)
typename std::iterator_traits< iterator_type >::reference reference
#define LIBCOPP_UTIL_FORCEINLINE