dxFeed Graal CXX API v4.2.0
Loading...
Searching...
No Matches
StringUtils.hpp
1// Copyright (c) 2025 Devexperts LLC.
2// SPDX-License-Identifier: MPL-2.0
3
4#pragma once
5
6#include "../Conf.hpp"
7
9
10#include <cstddef>
11#include <cstdint>
12#include <iterator>
13#include <locale>
14#include <optional>
15#include <string>
16#include <thread>
17#include <type_traits>
18#include <vector>
19
21
22struct DXFCPP_EXPORT String {
23 inline static const std::string EMPTY{};
24 inline static const std::string NUL{"<null>"};
25};
26
27DXFCPP_EXPORT std::string toString(bool b) noexcept;
28
29DXFCPP_EXPORT std::string toString(const char *chars) noexcept;
30
31DXFCPP_EXPORT std::optional<std::string> toStringOpt(const char *chars) noexcept;
32
33DXFCPP_EXPORT std::string toString(std::thread::id theadId);
34
35DXFCPP_EXPORT std::string toString(void *ptr);
36
37DXFCPP_EXPORT std::string toString(double d);
38
39// template <typename T> std::string toStringAny(T &&t);
40
41template <typename T, typename U> std::string toString(const std::pair<T, U> &p) {
42 return "{" + toStringAny(p.first) + ", " + toStringAny(p.second) + "}";
43}
44
45#if __cpp_concepts
46template <typename T> std::string toStringAny(T &&t) {
47 if constexpr (requires { t.toString(); }) {
48 return t.toString();
49 } else if constexpr (requires { t->toString(); }) {
50 return t->toString();
51 } else if constexpr (requires { toString(t); }) {
52 return toString(t);
53 } else if constexpr (requires { std::to_string(t); }) {
54 return std::to_string(t);
55 } else if constexpr (requires { std::string(t); }) {
56 return std::string(t);
57 } else {
58 return "unknown";
59 }
60}
61#else
62namespace to_string_any {
63namespace detail {
64template <typename T, typename = void> struct HasToStringMember : std::false_type {};
65
66template <typename T> struct HasToStringMember<T, decltype(std::declval<T>().toString(), void())> : std::true_type {};
67
68template <typename T, typename = void> struct HasToStringMemberByPointer : std::false_type {};
69
70template <typename T>
71struct HasToStringMemberByPointer<T, decltype(std::declval<T>()->toString(), void())> : std::true_type {};
72
73template <typename T, typename = void> struct HasFreeToString : std::false_type {};
74
75template <typename T> struct HasFreeToString<T, decltype(toString(std::declval<T>()), void())> : std::true_type {};
76
77template <typename T, typename = void> struct HasStdToString : std::false_type {};
78
79template <typename T> struct HasStdToString<T, decltype(std::to_string(std::declval<T>()), void())> : std::true_type {};
80
81template <typename T, typename = void> struct IsConvertibleToString : std::false_type {};
82
83template <typename T>
84struct IsConvertibleToString<T, typename std::enable_if<std::is_convertible<T, std::string>::value>::type>
85 : std::true_type {};
86
87} // namespace detail
88} // namespace to_string_any
89
90template <typename T>
91typename std::enable_if<to_string_any::detail::HasToStringMember<T>::value, std::string>::type toStringAny(T &&t) {
92 return t.toString();
93}
94
95template <typename T>
96typename std::enable_if<to_string_any::detail::HasToStringMemberByPointer<T>::value &&
97 !to_string_any::detail::HasToStringMember<T>::value,
98 std::string>::type
99toStringAny(T &&t) {
100 return t->toString();
101}
102
103template <typename T>
104typename std::enable_if<to_string_any::detail::HasFreeToString<T>::value &&
105 !to_string_any::detail::HasToStringMember<T>::value &&
106 !to_string_any::detail::HasToStringMemberByPointer<T>::value,
107 std::string>::type
108toStringAny(T &&t) {
109 return toString(t);
110}
111
112template <typename T>
113typename std::enable_if<to_string_any::detail::HasStdToString<T>::value &&
114 !to_string_any::detail::HasToStringMember<T>::value &&
115 !to_string_any::detail::HasToStringMemberByPointer<T>::value &&
116 !to_string_any::detail::HasFreeToString<T>::value,
117 std::string>::type
118toStringAny(T &&t) {
119 return std::to_string(t);
120}
121
122template <typename T>
123typename std::enable_if<
124 to_string_any::detail::IsConvertibleToString<T>::value && !to_string_any::detail::HasToStringMember<T>::value &&
125 !to_string_any::detail::HasToStringMemberByPointer<T>::value &&
126 !to_string_any::detail::HasFreeToString<T>::value && !to_string_any::detail::HasStdToString<T>::value,
127 std::string>::type
128toStringAny(T &&t) {
129 return std::string(t);
130}
131
132// Fallback case
133template <typename T>
134typename std::enable_if<!to_string_any::detail::HasToStringMember<T>::value &&
135 !to_string_any::detail::HasToStringMemberByPointer<T>::value &&
136 !to_string_any::detail::HasFreeToString<T>::value &&
137 !to_string_any::detail::HasStdToString<T>::value &&
138 !to_string_any::detail::IsConvertibleToString<T>::value,
139 std::string>::type
140toStringAny(T &&) {
141 return "unknown";
142}
143#endif
144
145/**
146 * Tries to convert UTF16 char to ASCII (part of UTF8) char.
147 *
148 * @param in The UTF16 char
149 * @return ASCII char
150 */
151DXFCPP_EXPORT char utf16to8(std::int16_t in) noexcept;
152
153/**
154 * Converts UTF16 char to UTF8 string
155 *
156 * @param in The UTF16 char
157 * @return UTF8 string
158 */
159DXFCPP_EXPORT std::string utf16toUtf8String(std::int16_t in) noexcept;
160
161/**
162 * Converts UTF16 string to UTF8 string
163 *
164 * @param in The UTF16 string
165 * @return UTF8 string
166 */
167DXFCPP_EXPORT std::string utf16toUtf8String(const std::u16string &in) noexcept;
168
169/**
170 * Converts vector of UTF16 chars to UTF8 string
171 *
172 * @param in The UTF16 string
173 * @return UTF8 string
174 */
175DXFCPP_EXPORT std::string utf16toUtf8String(const std::vector<std::int16_t> &in) noexcept;
176
177/**
178 * Tries to convert ASCII (part of UTF8) char to UTF16 char.
179 *
180 * @param in The ASCII char
181 * @return The UTF16 char
182 */
183DXFCPP_EXPORT std::int16_t utf8to16(char in) noexcept;
184
185DXFCPP_EXPORT std::string formatTimeStamp(std::int64_t timestamp);
186
187DXFCPP_EXPORT std::string formatTimeStampWithTimeZone(std::int64_t timestamp);
188
189DXFCPP_EXPORT std::string formatTimeStampFast(std::int64_t timestamp);
190
191DXFCPP_EXPORT std::string formatTimeStampWithMillis(std::int64_t timestamp);
192
193DXFCPP_EXPORT std::string formatTimeStampWithMillisWithTimeZone(std::int64_t timestamp);
194
195DXFCPP_EXPORT char *createCString(const std::string &s);
196
197DXFCPP_EXPORT char *createCString(const std::optional<std::string> &s);
198
199template <typename It>
200 requires requires { std::is_same_v<std::decay_t<decltype(It {} -> getName())>, std::string>; }
201std::string namesToString(It begin, It end) {
202 std::string result{"["};
203
204 for (auto it = begin; it != end; it++) {
205 result += String::EMPTY + "'" + it->getName() + "'" + (std::next(it) == end ? "" : ", ");
206 }
207
208 return result + "]";
209}
210
211template <typename It>
212 requires requires { std::is_same_v<std::decay_t<decltype(It {} -> get().getName())>, std::string>; }
213std::string namesToString(It begin, It end) {
214 std::string result{"["};
215
216 for (auto it = begin; it != end; it++) {
217 result += String::EMPTY + "'" + it->get().getName() + "'" + (std::next(it) == end ? "" : ", ");
218 }
219
220 return result + "]";
221}
222
223template <typename It>
224std::string elementsToString(It begin, It end, const std::string &prefix = "[", const std::string &postfix = "[",
225 const std::string &separator = ", ") {
226 std::string result{prefix};
227
228 for (auto it = begin; it != end; it++) {
229 result += String::EMPTY + toStringAny(*it) + (std::next(it) == end ? "" : separator);
230 }
231
232 return result + postfix;
233}
234
235DXFCPP_EXPORT std::string encodeChar(std::int16_t c);
236
237inline std::string encodeChar(char c) {
238 return encodeChar(static_cast<std::int16_t>(static_cast<unsigned char>(c)));
239}
240
241namespace detail {
242
243class IsIEqual {
244 std::locale locale_;
245
246 public:
247 explicit IsIEqual(const std::locale &locale = std::locale()) : locale_{locale} {
248 }
249
250 template <typename T, typename U> bool operator()(const T &t, const U &u) const {
251 return std::tolower<T>(t, locale_) == std::tolower<U>(u, locale_);
252 }
253};
254
255} // namespace detail
256
257template <typename Range1, typename Range2, typename Predicate>
258inline bool equals(const Range1 &first, const Range2 &second, Predicate cmp) {
259 auto firstIt = std::begin(first);
260 auto secondIt = std::begin(second);
261
262 for (; firstIt != std::end(first) && secondIt != std::end(second); ++firstIt, ++secondIt) {
263 if (!cmp(*firstIt, *secondIt)) {
264 return false;
265 }
266 }
267
268 return (secondIt == std::end(second)) && (firstIt == std::end(first));
269}
270
271DXFCPP_EXPORT inline bool iEquals(const std::string &first, const std::string &second) noexcept {
272 const std::locale &locale = std::locale();
273
274 return equals(first, second, detail::IsIEqual(locale));
275}
276
277DXFCPP_EXPORT inline bool iEquals(std::string_view first, std::string_view second) noexcept {
278 const std::locale &locale = std::locale();
279
280 return equals(first, second, detail::IsIEqual(locale));
281}
282
283DXFCPP_EXPORT inline std::size_t icHash(const std::string &s) noexcept {
284 const std::locale &locale = std::locale();
285 std::string result{};
286
287 for (auto c : s) {
288 result += std::tolower(c, locale);
289 }
290
291 return std::hash<std::string>()(result);
292}
293
294DXFCPP_EXPORT std::string trimStr(const std::string &s) noexcept;
295
296DXFCPP_EXPORT std::vector<std::string> splitStr(const std::string &s, char sep = ',') noexcept;
297
298DXFCPP_EXPORT std::string joinStr(const std::vector<std::string> &v, const std::string &sep = ", ") noexcept;
299
300DXFCPP_EXPORT bool toBool(const std::string &s) noexcept;
301
303
#define DXFCXX_DISABLE_MSC_WARNINGS_POP()
Definition Conf.hpp:22
#define DXFCPP_END_NAMESPACE
Definition Conf.hpp:70
#define DXFCPP_BEGIN_NAMESPACE
Definition Conf.hpp:67
#define DXFCXX_DISABLE_GCC_WARNINGS_PUSH(warnings)
Definition Conf.hpp:38
#define DXFCXX_DISABLE_GCC_WARNINGS_POP()
Definition Conf.hpp:40
#define DXFCXX_DISABLE_MSC_WARNINGS_PUSH(warnings)
Definition Conf.hpp:21
#define DXFCPP_EXPORT
Definition api.h:35
Base abstract class for all dxFeed C++ API entities.
Definition Entity.hpp:13
Marks all event types that can be received via dxFeed API.
Definition EventType.hpp:31
A helper class needed to construct smart pointers to objects, and does not allow explicit constructio...
Definition SharedEntity.hpp:89
static auto createShared(Args &&...args)
Creates smart pointer to object.
Definition SharedEntity.hpp:103
Base abstract "shared entity" class. Has some helpers for dynamic polymorphism.
Definition SharedEntity.hpp:21
virtual std::string toString() const
Returns a string representation of the current object.
Definition SharedEntity.hpp:78
std::shared_ptr< T > sharedAs() const noexcept
Returns a pointer to the current object wrapped in a smart pointer to type T.
Definition SharedEntity.hpp:69
std::shared_ptr< T > sharedAs() noexcept
Returns a pointer to the current object wrapped in a smart pointer to type T.
Definition SharedEntity.hpp:56
bool is() const noexcept
Checks that pointer to the current type could be converted to type T* In other words: whether type T ...
Definition SharedEntity.hpp:35
Universal functional object that allows searching std::unordered_map for string-like keys.
Definition Common.hpp:911
A simple wrapper around strings or something similar to strings to reduce the amount of code for meth...
Definition Common.hpp:794