xref: /aosp_15_r20/external/webrtc/rtc_base/string_encode.h (revision d9f758449e529ab9291ac668be2861e7a55c2422)
1*d9f75844SAndroid Build Coastguard Worker /*
2*d9f75844SAndroid Build Coastguard Worker  *  Copyright 2004 The WebRTC Project Authors. All rights reserved.
3*d9f75844SAndroid Build Coastguard Worker  *
4*d9f75844SAndroid Build Coastguard Worker  *  Use of this source code is governed by a BSD-style license
5*d9f75844SAndroid Build Coastguard Worker  *  that can be found in the LICENSE file in the root of the source
6*d9f75844SAndroid Build Coastguard Worker  *  tree. An additional intellectual property rights grant can be found
7*d9f75844SAndroid Build Coastguard Worker  *  in the file PATENTS.  All contributing project authors may
8*d9f75844SAndroid Build Coastguard Worker  *  be found in the AUTHORS file in the root of the source tree.
9*d9f75844SAndroid Build Coastguard Worker  */
10*d9f75844SAndroid Build Coastguard Worker 
11*d9f75844SAndroid Build Coastguard Worker #ifndef RTC_BASE_STRING_ENCODE_H_
12*d9f75844SAndroid Build Coastguard Worker #define RTC_BASE_STRING_ENCODE_H_
13*d9f75844SAndroid Build Coastguard Worker 
14*d9f75844SAndroid Build Coastguard Worker #include <stddef.h>
15*d9f75844SAndroid Build Coastguard Worker 
16*d9f75844SAndroid Build Coastguard Worker #include <string>
17*d9f75844SAndroid Build Coastguard Worker #include <type_traits>
18*d9f75844SAndroid Build Coastguard Worker #include <vector>
19*d9f75844SAndroid Build Coastguard Worker 
20*d9f75844SAndroid Build Coastguard Worker #include "absl/strings/string_view.h"
21*d9f75844SAndroid Build Coastguard Worker #include "absl/types/optional.h"
22*d9f75844SAndroid Build Coastguard Worker #include "api/array_view.h"
23*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/checks.h"
24*d9f75844SAndroid Build Coastguard Worker #include "rtc_base/string_to_number.h"
25*d9f75844SAndroid Build Coastguard Worker 
26*d9f75844SAndroid Build Coastguard Worker namespace rtc {
27*d9f75844SAndroid Build Coastguard Worker 
28*d9f75844SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////
29*d9f75844SAndroid Build Coastguard Worker // String Encoding Utilities
30*d9f75844SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////
31*d9f75844SAndroid Build Coastguard Worker 
32*d9f75844SAndroid Build Coastguard Worker std::string hex_encode(absl::string_view str);
33*d9f75844SAndroid Build Coastguard Worker std::string hex_encode_with_delimiter(absl::string_view source, char delimiter);
34*d9f75844SAndroid Build Coastguard Worker 
35*d9f75844SAndroid Build Coastguard Worker // hex_decode converts ascii hex to binary.
36*d9f75844SAndroid Build Coastguard Worker size_t hex_decode(ArrayView<char> buffer, absl::string_view source);
37*d9f75844SAndroid Build Coastguard Worker 
38*d9f75844SAndroid Build Coastguard Worker // hex_decode, assuming that there is a delimiter between every byte
39*d9f75844SAndroid Build Coastguard Worker // pair.
40*d9f75844SAndroid Build Coastguard Worker // `delimiter` == 0 means no delimiter
41*d9f75844SAndroid Build Coastguard Worker // If the buffer is too short or the data is invalid, we return 0.
42*d9f75844SAndroid Build Coastguard Worker size_t hex_decode_with_delimiter(ArrayView<char> buffer,
43*d9f75844SAndroid Build Coastguard Worker                                  absl::string_view source,
44*d9f75844SAndroid Build Coastguard Worker                                  char delimiter);
45*d9f75844SAndroid Build Coastguard Worker 
46*d9f75844SAndroid Build Coastguard Worker // Splits the source string into multiple fields separated by delimiter,
47*d9f75844SAndroid Build Coastguard Worker // with duplicates of delimiter creating empty fields. Empty input produces a
48*d9f75844SAndroid Build Coastguard Worker // single, empty, field.
49*d9f75844SAndroid Build Coastguard Worker std::vector<absl::string_view> split(absl::string_view source, char delimiter);
50*d9f75844SAndroid Build Coastguard Worker 
51*d9f75844SAndroid Build Coastguard Worker // Splits the source string into multiple fields separated by delimiter,
52*d9f75844SAndroid Build Coastguard Worker // with duplicates of delimiter ignored.  Trailing delimiter ignored.
53*d9f75844SAndroid Build Coastguard Worker size_t tokenize(absl::string_view source,
54*d9f75844SAndroid Build Coastguard Worker                 char delimiter,
55*d9f75844SAndroid Build Coastguard Worker                 std::vector<std::string>* fields);
56*d9f75844SAndroid Build Coastguard Worker 
57*d9f75844SAndroid Build Coastguard Worker // Extract the first token from source as separated by delimiter, with
58*d9f75844SAndroid Build Coastguard Worker // duplicates of delimiter ignored. Return false if the delimiter could not be
59*d9f75844SAndroid Build Coastguard Worker // found, otherwise return true.
60*d9f75844SAndroid Build Coastguard Worker bool tokenize_first(absl::string_view source,
61*d9f75844SAndroid Build Coastguard Worker                     char delimiter,
62*d9f75844SAndroid Build Coastguard Worker                     std::string* token,
63*d9f75844SAndroid Build Coastguard Worker                     std::string* rest);
64*d9f75844SAndroid Build Coastguard Worker 
65*d9f75844SAndroid Build Coastguard Worker // Convert arbitrary values to/from a string.
66*d9f75844SAndroid Build Coastguard Worker // TODO(jonasolsson): Remove these when absl::StrCat becomes available.
67*d9f75844SAndroid Build Coastguard Worker std::string ToString(bool b);
68*d9f75844SAndroid Build Coastguard Worker 
69*d9f75844SAndroid Build Coastguard Worker std::string ToString(absl::string_view s);
70*d9f75844SAndroid Build Coastguard Worker // The const char* overload is needed for correct overload resolution because of
71*d9f75844SAndroid Build Coastguard Worker // the const void* version of ToString() below.
72*d9f75844SAndroid Build Coastguard Worker std::string ToString(const char* s);
73*d9f75844SAndroid Build Coastguard Worker 
74*d9f75844SAndroid Build Coastguard Worker std::string ToString(short s);
75*d9f75844SAndroid Build Coastguard Worker std::string ToString(unsigned short s);
76*d9f75844SAndroid Build Coastguard Worker std::string ToString(int s);
77*d9f75844SAndroid Build Coastguard Worker std::string ToString(unsigned int s);
78*d9f75844SAndroid Build Coastguard Worker std::string ToString(long int s);
79*d9f75844SAndroid Build Coastguard Worker std::string ToString(unsigned long int s);
80*d9f75844SAndroid Build Coastguard Worker std::string ToString(long long int s);
81*d9f75844SAndroid Build Coastguard Worker std::string ToString(unsigned long long int s);
82*d9f75844SAndroid Build Coastguard Worker 
83*d9f75844SAndroid Build Coastguard Worker std::string ToString(double t);
84*d9f75844SAndroid Build Coastguard Worker std::string ToString(long double t);
85*d9f75844SAndroid Build Coastguard Worker 
86*d9f75844SAndroid Build Coastguard Worker std::string ToString(const void* p);
87*d9f75844SAndroid Build Coastguard Worker 
88*d9f75844SAndroid Build Coastguard Worker template <typename T,
89*d9f75844SAndroid Build Coastguard Worker           typename std::enable_if<std::is_arithmetic<T>::value &&
90*d9f75844SAndroid Build Coastguard Worker                                       !std::is_same<T, bool>::value,
91*d9f75844SAndroid Build Coastguard Worker                                   int>::type = 0>
FromString(absl::string_view s,T * t)92*d9f75844SAndroid Build Coastguard Worker static bool FromString(absl::string_view s, T* t) {
93*d9f75844SAndroid Build Coastguard Worker   RTC_DCHECK(t);
94*d9f75844SAndroid Build Coastguard Worker   absl::optional<T> result = StringToNumber<T>(s);
95*d9f75844SAndroid Build Coastguard Worker 
96*d9f75844SAndroid Build Coastguard Worker   if (result)
97*d9f75844SAndroid Build Coastguard Worker     *t = *result;
98*d9f75844SAndroid Build Coastguard Worker 
99*d9f75844SAndroid Build Coastguard Worker   return result.has_value();
100*d9f75844SAndroid Build Coastguard Worker }
101*d9f75844SAndroid Build Coastguard Worker 
102*d9f75844SAndroid Build Coastguard Worker bool FromString(absl::string_view s, bool* b);
103*d9f75844SAndroid Build Coastguard Worker 
104*d9f75844SAndroid Build Coastguard Worker template <typename T>
FromString(absl::string_view str)105*d9f75844SAndroid Build Coastguard Worker static inline T FromString(absl::string_view str) {
106*d9f75844SAndroid Build Coastguard Worker   T val;
107*d9f75844SAndroid Build Coastguard Worker   FromString(str, &val);
108*d9f75844SAndroid Build Coastguard Worker   return val;
109*d9f75844SAndroid Build Coastguard Worker }
110*d9f75844SAndroid Build Coastguard Worker 
111*d9f75844SAndroid Build Coastguard Worker //////////////////////////////////////////////////////////////////////
112*d9f75844SAndroid Build Coastguard Worker 
113*d9f75844SAndroid Build Coastguard Worker }  // namespace rtc
114*d9f75844SAndroid Build Coastguard Worker 
115*d9f75844SAndroid Build Coastguard Worker #endif  // RTC_BASE_STRING_ENCODE_H__
116