C++ Server-Side SDK
LaunchDarkly SDK
expiration_tracker.hpp
1 #pragma once
2 
3 #include "../dependency_tracker/data_kind.hpp"
4 #include "../dependency_tracker/tagged_data.hpp"
5 
6 #include <array>
7 #include <chrono>
8 #include <optional>
9 #include <ostream>
10 #include <string>
11 #include <unordered_map>
12 #include <vector>
13 
14 namespace launchdarkly::server_side::data_components {
15 
17  public:
18  using TimePoint = std::chrono::time_point<std::chrono::steady_clock>;
19 
23  enum class TrackState {
27  kFresh,
31  kStale,
36  };
37 
45  void Add(std::string const& key, TimePoint expiration);
46 
52  void Remove(std::string const& key);
53 
61  TrackState State(std::string const& key, TimePoint current_time) const;
62 
70  void Add(DataKind kind, std::string const& key, TimePoint expiration);
71 
78  void Remove(DataKind kind, std::string const& key);
79 
87  TrackState State(DataKind kind,
88  std::string const& key,
89  TimePoint current_time) const;
90 
94  void Clear();
95 
102  std::vector<std::pair<std::optional<DataKind>, std::string>> Prune(
103  TimePoint current_time);
104 
105  private:
106  using TtlMap = std::unordered_map<std::string, TimePoint>;
107 
108  TtlMap unscoped_;
109 
110  static TrackState State(TimePoint expiration, TimePoint current_time);
111 
112  class ScopedTtls {
113  public:
114  ScopedTtls();
115 
116  using DataType =
117  std::array<TaggedData<TtlMap>,
118  static_cast<std::underlying_type_t<DataKind>>(
119  DataKind::kKindCount)>;
120  void Set(DataKind kind, std::string const& key, TimePoint expiration);
121  void Remove(DataKind kind, std::string const& key);
122  std::optional<TimePoint> Get(DataKind kind,
123  std::string const& key) const;
124  void Clear();
125 
126  [[nodiscard]] typename DataType::iterator begin();
127 
128  [[nodiscard]] typename DataType::iterator end();
129 
130  private:
131  DataType data_;
132  };
133 
134  ScopedTtls scoped_;
135 };
136 
137 std::ostream& operator<<(std::ostream& out,
138  ExpirationTracker::TrackState const& state);
139 
140 } // namespace launchdarkly::server_side::data_components
std::vector< std::pair< std::optional< DataKind >, std::string > > Prune(TimePoint current_time)
Definition: expiration_tracker.cpp:52
void Remove(std::string const &key)
Definition: expiration_tracker.cpp:11
TrackState State(std::string const &key, TimePoint current_time) const
Definition: expiration_tracker.cpp:15
void Clear()
Definition: expiration_tracker.cpp:47
void Add(std::string const &key, TimePoint expiration)
Definition: expiration_tracker.cpp:7