C++ Server-Side SDK
LaunchDarkly SDK
bucketing.hpp
1 #pragma once
2 
3 #include "evaluation_error.hpp"
4 
5 #include <launchdarkly/attribute_reference.hpp>
6 #include <launchdarkly/context.hpp>
7 #include <launchdarkly/data_model/flag.hpp>
8 
9 #include <tl/expected.hpp>
10 
11 #include <cstdint>
12 #include <limits>
13 #include <optional>
14 #include <ostream>
15 #include <string>
16 #include <variant>
17 
18 namespace launchdarkly::server_side::evaluation {
19 
20 double const kBucketScale = 100'000.0;
21 
22 enum RolloutKindLookup {
23  /* The rollout's context kind was found in the supplied evaluation context.
24  */
25  kPresent,
26  /* The rollout's context kind was not found in the supplied evaluation
27  * context. */
28  kAbsent
29 };
30 
36 class BucketPrefix {
37  public:
38  struct KeyAndSalt {
39  std::string key;
40  std::string salt;
41  };
42 
43  using Seed = std::int64_t;
44 
49  explicit BucketPrefix(Seed seed);
50 
56  BucketPrefix(std::string key, std::string salt);
57 
58  friend std::ostream& operator<<(std::ostream& os,
59  BucketPrefix const& prefix);
60 
61  private:
62  std::variant<KeyAndSalt, Seed> prefix_;
63 };
64 
65 using ContextHashValue = double;
66 
81 tl::expected<std::pair<ContextHashValue, RolloutKindLookup>, Error> Bucket(
82  Context const& context,
83  AttributeReference const& by_attr,
84  BucketPrefix const& prefix,
85  bool is_experiment,
86  std::string const& context_kind);
87 
88 class BucketResult {
89  public:
91  data_model::Flag::Rollout::WeightedVariation weighted_variation,
92  bool is_experiment);
93 
94  BucketResult(data_model::Flag::Variation variation, bool in_experiment);
95 
96  BucketResult(data_model::Flag::Variation variation);
97 
98  [[nodiscard]] std::size_t VariationIndex() const;
99 
100  [[nodiscard]] bool InExperiment() const;
101 
102  private:
103  std::size_t variation_index_;
104  bool in_experiment_;
105 };
106 
118 tl::expected<BucketResult, Error> Variation(
119  data_model::Flag::VariationOrRollout const& variation_or_rollout,
120  std::string const& flag_key,
121  Context const& context,
122  std::optional<std::string> const& salt);
123 
124 } // namespace launchdarkly::server_side::evaluation
Definition: attribute_reference.hpp:34
Definition: context.hpp:29
BucketPrefix(Seed seed)
Definition: bucketing.cpp:25
Definition: evaluation_error.hpp:9