xref: /aosp_15_r20/external/webrtc/rtc_base/unique_id_generator.cc (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1 /*
2  *  Copyright 2018 The WebRTC project authors. All Rights Reserved.
3  *
4  *  Use of this source code is governed by a BSD-style license
5  *  that can be found in the LICENSE file in the root of the source
6  *  tree. An additional intellectual property rights grant can be found
7  *  in the file PATENTS.  All contributing project authors may
8  *  be found in the AUTHORS file in the root of the source tree.
9  */
10 
11 #include "rtc_base/unique_id_generator.h"
12 
13 #include <limits>
14 #include <vector>
15 
16 #include "absl/strings/string_view.h"
17 #include "rtc_base/helpers.h"
18 #include "rtc_base/string_encode.h"
19 #include "rtc_base/string_to_number.h"
20 
21 namespace rtc {
22 
UniqueRandomIdGenerator()23 UniqueRandomIdGenerator::UniqueRandomIdGenerator() : known_ids_() {}
UniqueRandomIdGenerator(ArrayView<uint32_t> known_ids)24 UniqueRandomIdGenerator::UniqueRandomIdGenerator(ArrayView<uint32_t> known_ids)
25     : known_ids_(known_ids.begin(), known_ids.end()) {}
26 
27 UniqueRandomIdGenerator::~UniqueRandomIdGenerator() = default;
28 
GenerateId()29 uint32_t UniqueRandomIdGenerator::GenerateId() {
30   webrtc::MutexLock lock(&mutex_);
31 
32   RTC_CHECK_LT(known_ids_.size(), std::numeric_limits<uint32_t>::max() - 1);
33   while (true) {
34     auto pair = known_ids_.insert(CreateRandomNonZeroId());
35     if (pair.second) {
36       return *pair.first;
37     }
38   }
39 }
40 
AddKnownId(uint32_t value)41 bool UniqueRandomIdGenerator::AddKnownId(uint32_t value) {
42   webrtc::MutexLock lock(&mutex_);
43   return known_ids_.insert(value).second;
44 }
45 
UniqueStringGenerator()46 UniqueStringGenerator::UniqueStringGenerator() : unique_number_generator_() {}
UniqueStringGenerator(ArrayView<std::string> known_ids)47 UniqueStringGenerator::UniqueStringGenerator(ArrayView<std::string> known_ids) {
48   for (const std::string& str : known_ids) {
49     AddKnownId(str);
50   }
51 }
52 
53 UniqueStringGenerator::~UniqueStringGenerator() = default;
54 
GenerateString()55 std::string UniqueStringGenerator::GenerateString() {
56   return ToString(unique_number_generator_.GenerateNumber());
57 }
58 
AddKnownId(absl::string_view value)59 bool UniqueStringGenerator::AddKnownId(absl::string_view value) {
60   // TODO(webrtc:13579): remove string copy here once absl::string_view version
61   // of StringToNumber is available.
62   absl::optional<uint32_t> int_value =
63       StringToNumber<uint32_t>(std::string(value));
64   // The underlying generator works for uint32_t values, so if the provided
65   // value is not a uint32_t it will never be generated anyway.
66   if (int_value.has_value()) {
67     return unique_number_generator_.AddKnownId(int_value.value());
68   }
69   return false;
70 }
71 
72 }  // namespace rtc
73