19 template <
typename Storage>
20 using Collection = data_model::SDKDataSet::Collection<std::string, Storage>;
22 template <
typename Storage>
23 using SharedItem = std::shared_ptr<data_model::ItemDescriptor<Storage>>;
25 template <
typename Storage>
26 using SharedCollection =
27 std::unordered_map<std::string, SharedItem<Storage>>;
31 std::unique_ptr<IConnection>
OnFlagChange(ChangeHandler handler)
override;
33 void Init(data_model::SDKDataSet data_set)
override;
34 void Upsert(std::string
const& key,
35 data_model::FlagDescriptor flag)
override;
36 void Upsert(std::string
const& key,
37 data_model::SegmentDescriptor segment)
override;
39 [[nodiscard]] std::string
const&
Identity()
const override;
49 bool HasListeners()
const;
51 template <
typename FlagOrSegment>
52 void UpsertCommon(DataKind kind,
54 SharedItem<FlagOrSegment> existing,
55 data_model::ItemDescriptor<FlagOrSegment> updated) {
56 if (existing && (updated.version <= existing->version)) {
66 NotifyChanges(updated_deps);
69 sink_.Upsert(key, updated);
72 template <
typename FlagOrSegment>
73 void CalculateChanges(
75 SharedCollection<FlagOrSegment>
const& existing_flags_or_segments,
76 Collection<FlagOrSegment>
const& new_flags_or_segments,
78 for (
auto const& old_flag_or_segment : existing_flags_or_segments) {
79 auto new_flag_or_segment =
80 new_flags_or_segments.find(old_flag_or_segment.first);
81 if (new_flag_or_segment != new_flags_or_segments.end() &&
82 new_flag_or_segment->second.version <=
83 old_flag_or_segment.second->version) {
89 kind, old_flag_or_segment.first, updated_items);
92 for (
auto const& flag_or_segment : new_flags_or_segments) {
94 existing_flags_or_segments.find(flag_or_segment.first);
95 if (oldItem != existing_flags_or_segments.end() &&
96 flag_or_segment.second.version <= oldItem->second->version) {
111 boost::signals2::signal<void(std::shared_ptr<ChangeSet>)> signals_;
121 mutable std::recursive_mutex signal_mutex_;