Go to the documentation of this file. 1 #ifndef CONSCIENCE_UTIL_h
2 #define CONSCIENCE_UTIL_h
28 #define deleteIfNotNull(objPointer) \
31 objPointer = nullptr; \
33 #define deleteItems(vectorOfItems) [](const auto &theVector) { for (const auto * item : theVector) { delete item; } }(vectorOfItems)
34 #define deleteValues(mapOfKeysAndValues) [](const auto &theMap) { for (auto it = theMap.begin(); it != theMap.end(); it++) { delete it->second; } }(mapOfKeysAndValues)
36 #define vectorSafeAt(vector, index, vectorDescription) [&](const auto *theVectorPtr, int theIndex) { return (theIndex >= theVectorPtr->size() ? throw std::runtime_error("WARNING: try to reach index " + to_string(theIndex) + " from vector " + vectorDescription + " of size " + to_string(theVectorPtr->size())) : theVectorPtr->at(theIndex)); }(vector, index)
37 #define mapSafeAt(map, key, mapDescription) [&](const auto *theMapPtr, const auto &theKey) { return (theMapPtr->find(theKey) == theMapPtr->end() ? throw std::runtime_error("WARNING: try to reach key " + toStringOrNullString(theKey) + " from map " + mapDescription + " of size " + to_string(theMapPtr->size())) : theMapPtr->at(theKey)); }(map, key)
39 #define vectorSafeAt(vector, index, vectorDescription) (vector)->at(index)
40 #define mapSafeAt(map, key, mapDescription) (map)->at(key)
43 #define ASSERT(MSG, EXPR) \
44 assert(((void)string((MSG)).c_str(), (EXPR)))
47 #define MACRO_PARENS ()
50 #define VARGS_STR_HELPER(...) #__VA_ARGS__
51 #define VARGS_STR(...) VARGS_STR_HELPER(__VA_ARGS__)
54 #define MACRO_EXPAND(arg) MACRO_EXPAND1(MACRO_EXPAND1(MACRO_EXPAND1(MACRO_EXPAND1(arg))))
55 #define MACRO_EXPAND1(arg) MACRO_EXPAND2(MACRO_EXPAND2(MACRO_EXPAND2(MACRO_EXPAND2(arg))))
56 #define MACRO_EXPAND2(arg) MACRO_EXPAND3(MACRO_EXPAND3(MACRO_EXPAND3(MACRO_EXPAND3(arg))))
57 #define MACRO_EXPAND3(arg) MACRO_EXPAND4(MACRO_EXPAND4(MACRO_EXPAND4(MACRO_EXPAND4(arg))))
58 #define MACRO_EXPAND4(arg) arg
60 #define FOR_EACH(macro, ...) \
61 __VA_OPT__(MACRO_EXPAND(FOR_EACH_HELPER(macro, __VA_ARGS__)))
62 #define FOR_EACH_HELPER(macro, a1, ...) \
64 __VA_OPT__(FOR_EACH_AGAIN MACRO_PARENS(macro, __VA_ARGS__))
65 #define FOR_EACH_AGAIN() FOR_EACH_HELPER
67 #define ENUM_TO_STRING_FILL_MAP(name) \
70 std::string enumIdentifier = #name; \
71 size_t pos = enumIdentifier.find("*/"); \
72 if (pos != std::string::npos) { \
73 enumIdentifier = trim(enumIdentifier.substr(pos + 1)); \
75 theMap[name] = enumIdentifier; \
78 #define ENUM(ENUM_typeName, ...) \
79 enum ENUM_typeName : unsigned long long { \
82 inline const std::map<ENUM_typeName, std::string> &getEnumNames##ENUM_typeName() { \
83 static std::map<ENUM_typeName, std::string> theMap; \
84 if (theMap.size() == 0) { \
85 FOR_EACH(ENUM_TO_STRING_FILL_MAP, __VA_ARGS__) \
89 inline string toString##ENUM_typeName(ENUM_typeName enumElement) { \
90 auto &names = getEnumNames##ENUM_typeName(); \
91 auto matchIt = names.find(enumElement); \
92 return matchIt == names.end() ? "unknown " + to_string(enumElement) : matchIt->second; \
94 inline vector<ENUM_typeName> getValues##ENUM_typeName() { \
95 return {__VA_ARGS__}; \
97 inline bool is##ENUM_typeName##Valid(ENUM_typeName item) { \
98 vector<ENUM_typeName> values = getValues##ENUM_typeName(); \
99 for (auto itemFromValues : values) { \
100 if (itemFromValues == item) { \
106 inline ENUM_typeName intTo##ENUM_typeName(int value) { \
107 ENUM_typeName item = (ENUM_typeName)value; \
108 if (!is##ENUM_typeName##Valid(item)) { \
109 throw runtime_error("invalid " + string(#ENUM_typeName) + " value: " + to_string(value)); \
113 inline ENUM_typeName parse##ENUM_typeName(const string &enumElementString) { \
114 optional<ENUM_typeName> match = keyOfValueInMap(&getEnumNames##ENUM_typeName(), enumElementString); \
116 return match.value(); \
118 throw conscience_utils::CannotParseEnumException("unknown element: " + enumElementString); \
121 using std::string, std::any, std::function,
std::to_string, std::pair, std::make_pair, std::optional, std::vector, std::ostringstream, std::ostream_iterator, std::map, std::endl, std::cerr, std::variant, std::string, std::chrono::milliseconds, std::chrono::system_clock, std::chrono::high_resolution_clock, std::runtime_error, std::type_info;
128 template <
class TTestedType,
class TPo
intee>
129 concept
IsPointerOf = std::is_same_v<TTestedType, const TPointee *> || std::is_same_v<TTestedType, TPointee *> || std::is_same_v<TTestedType, std::shared_ptr<const TPointee>> || std::is_same_v<TTestedType, std::shared_ptr<TPointee>>;
134 template <
class,
template <
class...>
class>
140 template <
template <
class...>
class T,
class... Args>
143 template <
typename T>
146 template <
typename T>
147 concept
IsVector = IsTemplatedType<T, std::vector>;
153 template <
class T, std::
size_t I>
159 template <
typename T>
160 concept
IsMap = IsTemplatedType<T, std::map>;
162 template <
typename T>
166 template <
typename T>
174 template <
typename U>
177 static constexpr
bool isPointer =
true;
181 template <
typename U>
184 static constexpr
bool isPointer =
true;
188 template <
typename U>
191 static constexpr
bool isPointer =
true;
195 template <
typename U>
198 static constexpr
bool isPointer =
true;
201 template <
typename T>
204 template <
typename T>
211 template <
typename U>
217 template <
typename T>
226 string trim(
const string &str,
const string &trimmedChars =
" ");
246 vector<string> *
splitString(
const string &inputString,
const string &delimiter,
bool escapeDelimiterWithBackslash =
false);
248 vector<float> *
parseFloatList(
string input,
char separator =
',');
250 vector<int> *
parseIntList(
string input,
char separator =
',');
252 map<string, string>
parseMap(
string input,
const string &entriesSeparator =
"&",
const string &keyValueSeparator =
"=",
bool removeGlobalBracketIfExist =
false);
254 optional<int>
parseInt(
const string &inputString);
261 bool replaceInString(
string &str,
const string &from,
const string &to,
bool onlyFirst =
true);
285 if (
object ==
nullptr) {
305 if (!vector.empty()) {
307 copy(vector.begin(), vector.end() - 1,
308 ostream_iterator<T>(oss, separator));
311 oss << vector.back();
319 return (vector<const T *> *)(vector<void *> *)theVector;
324 return (vector<const T *> &)(vector<void *> &)theVector;
329 return (vector<const T *> &)(vector<void *> &)theVector;
334 return (
const vector<const T *> &)(
const vector<void *> &)theVector;
338 vector<T>
vectorsConcat(
const vector<T> &vector1,
const vector<T> &vector2) {
339 vector<T>
copy = vector1;
340 copy.insert(
copy.end(), vector2.begin(), vector2.end());
349 auto clone =
new vector<T *>();
351 clone->push_back(item->clone());
358 if (find(vector.begin(), vector.end(), value) == vector.end()) {
359 vector.push_back(value);
366 template <
class T,
class R>
369 std::transform(
source.begin(),
source.end(), std::back_inserter(output), transformFunction);
374 inline typename std::vector<T>::iterator
vectorIndexOf(
const vector<T> &vector, T value) {
375 return std::find(vector.begin(), vector.end(), value);
380 if (vector.empty()) {
383 return std::find(vector.begin(), vector.end(), value) != vector.end();
393 inline vector<T> &
vectorRemoveIf(vector<T> &theVector,
function<
bool(
const T &)> predicate) {
394 auto it = theVector.begin();
395 while (it != theVector.end()) {
396 if (predicate(*it)) {
397 it = theVector.erase(it);
411 theVector.erase(std::remove(theVector.begin(), theVector.end(), item), theVector.end());
418 template <
class K,
class V>
420 for (
const auto &[key, value] : *map) {
421 if (value == searchedValue) {
428 template <
class TKey,
class TValue>
429 bool areMapsEqual(
const map<TKey, TValue> &map1,
const map<TKey, TValue> &map2) {
430 return map1.size() == map2.size() && std::equal(map1.begin(), map1.end(), map2.begin());
436 template <
class TKey,
class TValue>
437 vector<TKey>
mapKeys(
const map<TKey, TValue> &theMap) {
440 if (!theMap.empty()) {
441 for (
auto it = theMap.begin(); it != theMap.end(); it++) {
442 keys.push_back(it->first);
452 template <
class TKey,
class TValue>
454 vector<TValue> values;
455 for (
auto it = theMap.begin(); it != theMap.end(); it++) {
456 values.push_back((TValue)it->second);
465 template <
class TKey,
class TValue>
466 vector<TValue>
mapValues(
const map<TKey, TValue> &theMap) {
467 vector<TValue> values;
468 for (
auto it = theMap.begin(); it != theMap.end(); it++) {
469 values.push_back(it->second);
478 template <
class TKey,
class TValue>
479 vector<TValue *>
mapValues(
const map<TKey, TValue *> &theMap) {
480 vector<TValue *> values;
481 for (
auto it = theMap.begin(); it != theMap.end(); it++) {
482 values.push_back(it->second);
490 template <
class TKey,
class TValue>
492 auto it = theMap.find(key);
493 if (it != theMap.end()) {
501 template <
class K,
class V>
502 string mapToString(
const map<K, V> &theMap,
const string &entriesSeparator =
",",
const string &keyValueSeparator =
"=") {
505 if (!theMap.empty()) {
506 for (
auto it = theMap.begin(); it != theMap.end(); it++) {
507 oss << it->first << keyValueSeparator << it->second << entriesSeparator;
514 system_clock::time_point
timepointWithTime(optional<int> hours = {}, optional<int> minutes = {}, optional<int> seconds = {}, system_clock::time_point timePoint = system_clock::now());
516 unsigned long long timestampWithTime(optional<int> hours = {}, optional<int> minutes = {}, optional<int> seconds = {}, system_clock::time_point timePoint = system_clock::now());
518 unsigned long long toMillis(system_clock::time_point timePoint);
520 unsigned long long diffMillis(system_clock::time_point timePoint1, system_clock::time_point timePoint2);
524 system_clock::time_point
toTimePoint(
unsigned long long timestampMillis);
526 template <
typename K,
typename V>
527 bool equals(
const map<K, V> &map1,
const map<K, V> &map2) {
528 if (map1.size() != map2.size()) {
531 for (
auto it = map1.begin(); it != map1.end(); it++) {
532 if (map2.find(it->first) == map2.end()) {
535 if (map2.at(it->first) != map1.at(it->first)) {
552 template <
typename T>
554 return valueToBound < min ? min : (valueToBound > max ? max : valueToBound);
579 int randomInt(
int lowerBound,
int upperBound);
581 template <
typename T>
583 std::ostringstream out;
584 out << std::setprecision(n) << std::noshowpoint << value;
587 template <
typename T>
590 template <
typename T>
593 template <
typename T>
596 template <
typename T>
598 return reinterpret_cast<char *
>(
static_cast<T *
>(
nullptr) + 1) -
reinterpret_cast<char *
>(
static_cast<T *
>(
nullptr));
601 template <
typename T>
603 *((T *)(
const void *)(bytes +
index)) = data;
604 index += size_of<T>();
612 template <
typename T>
617 T minValue = array[0];
618 for (
int i = 1;
i < size;
i++) {
619 if (array[
i] < minValue) {
626 template <
typename T>
632 T maxValue = array[0];
633 for (
int i = 1;
i < size;
i++) {
634 if (array[
i] > maxValue) {
641 template <
typename T>
647 T minValue = array[0][row];
648 for (
int i = 1;
i < size;
i++) {
649 if (array[
i][row] < minValue) {
650 minValue = array[
i][row];
656 template <
typename T>
662 T maxValue = array[0][row];
663 for (
int i = 1;
i < size;
i++) {
664 if (array[
i][row] > maxValue) {
665 maxValue = array[
i][row];
676 bool doublesEqual(
double value1,
double value2,
double epsilon = 0.0000001);
677 bool floatsEqual(
float value1,
float value2,
float epsilon = 0.0000001);
679 template <
typename T>
681 ASSERT(
"Cannot get an element from an empty vector.", !vec->empty());
683 std::random_device rd;
684 std::mt19937 gen(rd());
685 std::uniform_int_distribution<> dis(0, vec->size() - 1);
686 return vec->at(dis(gen));
696 optional<any>
getMapValueByPath(
const map<string, any> &data,
const string &path);
702 const char *
what()
const noexcept
override;
706 const string errorMessage;
709 string getClassName(
const std::type_info ¶msClass,
bool withNamespace);
716 string stringPadLeft(
const string &input,
size_t totalLength,
char padChar =
' ');
717 string stringPadRight(
const string &input,
size_t totalLength,
char padChar =
' ');
int randomInt(int lowerBound, int upperBound)
Definition: conscience_util.cpp:331
vector< R > vectorTransform(const vector< T > &source, function< R(const T &item)> transformFunction)
Definition: conscience_util.h:367
string doubleArrayToString(double *doubleArray, int size)
Definition: conscience_util.cpp:74
const string ALPHANUMERIC_CHARS
Definition: conscience_util.h:568
T findMinRowValueFromArray(T **array, size_t size, int row)
Definition: conscience_util.h:642
NLOHMANN_BASIC_JSON_TPL_DECLARATION std::string to_string(const NLOHMANN_BASIC_JSON_TPL &j)
user-defined to_string function for JSON values
Definition: json.hpp:26470
Definition: conscience_util.h:557
bool stringsAreEqualCaseInsensitive(const string &a, const string &b)
Definition: conscience_util.cpp:319
unsigned long long timestampWithTime(optional< int > hours, optional< int > minutes, optional< int > seconds, system_clock::time_point timePoint)
Definition: conscience_util.cpp:278
unsigned size
Definition: conscience_util.h:559
string timePointToString(system_clock::time_point point)
Definition: conscience_util.cpp:705
void pushInBytes(char *bytes, int &index, T data)
Definition: conscience_util.h:602
string intArrayToString(int *intArray, int size)
Definition: conscience_util.cpp:86
vector< TValue > mapValues(const map< TKey, TValue > &theMap)
Definition: conscience_util.h:466
U pointee_type
Definition: conscience_util.h:214
string to_string_precision(const T value, const int n=2)
Definition: conscience_util.h:582
string randomUUID()
Definition: conscience_util.cpp:338
float randomFloat(float aBound, float bBound)
Definition: conscience_util.cpp:390
optional< int > parseInt(const string &inputString)
Definition: conscience_util.cpp:437
const U pointee_type
Definition: conscience_util.h:197
string to_string_precision_double(const T value)
Definition: conscience_util.h:591
system_clock::time_point timepointWithTime(optional< int > hours, optional< int > minutes, optional< int > seconds, system_clock::time_point timePoint)
Definition: conscience_util.cpp:258
vector< T * > * vectorCloneDeep(const vector< T * > *source)
Definition: conscience_util.h:345
T findMaxRowValueFromArray(T **array, size_t size, int row)
Definition: conscience_util.h:657
bool startsWithIgnoreCase(const string &str, const string &searchedPrefix)
Definition: conscience_util.cpp:484
string snakeCaseToPascalCase(const string &snakeCaseString)
Definition: conscience_util.cpp:498
string toStringOrNullString(T *object)
Definition: conscience_util.h:284
bool doublesEqual(double value1, double value2, double epsilon)
Definition: conscience_util.cpp:518
void removeSpacesInString(string &str)
Definition: conscience_util.cpp:124
U pointee_type
Definition: conscience_util.h:176
string stringPadRight(const string &input, size_t totalLength, char padChar)
Definition: conscience_util.cpp:699
unsigned long long nowMillis()
Definition: conscience_util.cpp:294
bool floatsEqual(float value1, float value2, float epsilon)
Definition: conscience_util.cpp:522
vector< string > * splitString(const string &inputString, const string &delimiter, bool escapeDelimiterWithBackslash)
Definition: conscience_util.cpp:235
bool replaceAllInString(string &str, const string &from, const string &to)
Definition: conscience_util.cpp:120
U pointee_type
Definition: conscience_util.h:190
constexpr bool IsStdFixedArray
Definition: conscience_util.h:157
T findMinValue(T *array, size_t size)
Definition: conscience_util.h:613
char * copyStringChars(const string &str)
Definition: conscience_util.cpp:312
optional< double > parseDouble(const string &inputString)
Definition: conscience_util.cpp:446
bool vectorContains(const vector< T > &vector, T value)
Definition: conscience_util.h:379
string to_string_precision_lngLat(const T value)
Definition: conscience_util.h:594
string boolToString(bool value)
Definition: conscience_util.cpp:99
string toStringTimestampMillis(unsigned long long timestampInMs, string format)
Definition: conscience_util.cpp:465
string toStringCurrentTimeWithMillis()
Definition: conscience_util.cpp:131
Definition: conscience_util.h:205
double * array
Definition: conscience_util.h:608
string to_string_precision_float(const T value)
Definition: conscience_util.h:588
constexpr size_t size_of()
Definition: conscience_util.h:597
map< string, string > parseMap(string input, const string &entriesSeparator, const string &keyValueSeparator, bool removeGlobalBracketIfExist)
Definition: conscience_util.cpp:216
T enforceBounds(T valueToBound, T min, T max)
Definition: conscience_util.h:553
const U pointee_type
Definition: conscience_util.h:183
string trim(const string &str, const string &trimmedChars)
Definition: conscience_util.cpp:53
void stringRemoveToken(string &s, const std::string_view &token)
Definition: conscience_util.cpp:726
string getClassName(const type_info ¶msClass, bool withNamespace)
Definition: conscience_util.cpp:593
vector< T > vectorsConcat(const vector< T > &vector1, const vector< T > &vector2)
Definition: conscience_util.h:338
string floatArrayToString(float *floatArray, int size)
Definition: conscience_util.cpp:62
void mapEraseIfExist(std::map< TKey, TValue > &theMap, const TKey &key)
Definition: conscience_util.h:491
concept IsStarPointer
Definition: conscience_util.h:202
static constexpr bool isPointer
Definition: conscience_util.h:170
concept IsMap
Definition: conscience_util.h:160
concept IsEnum
Definition: conscience_util.h:163
system_clock::time_point toTimePoint(unsigned long long timestampMillis)
Definition: conscience_util.cpp:298
char * concatenateCharArray(const char *a, const char *b)
Definition: conscience_util.cpp:421
unsigned long long toMillis(system_clock::time_point timePoint)
Definition: conscience_util.cpp:282
std::vector< T >::iterator vectorIndexOf(const vector< T > &vector, T value)
Definition: conscience_util.h:374
string randomString(size_t length, const string &allowedChars)
Definition: conscience_util.cpp:374
const string ALPHABETICAL_CHARS
Definition: conscience_util.h:567
vector< T > & vectorRemoveIf(vector< T > &theVector, function< bool(const T &)> predicate)
Definition: conscience_util.h:393
void vectorPushIfMissing(vector< T > &vector, T value)
Definition: conscience_util.h:357
bool stringIsNumber(const string &str)
Definition: conscience_util.cpp:303
vector< TKey > mapKeys(const map< TKey, TValue > &theMap)
Definition: conscience_util.h:437
unsigned size
Definition: conscience_util.h:609
uint32_t index(const std::array< char, 64 > &alphabet, char symbol)
Definition: base.h:91
j template void())
Definition: json.hpp:4189
const char * what() const noexcept override
Definition: conscience_util.cpp:585
optional< any > getMapValueByPath(const map< string, any > &data, const string &path)
Definition: conscience_util.cpp:542
T findMaxValue(T *array, size_t size)
Definition: conscience_util.h:627
vector< float > * parseFloatList(string input, char separator)
Definition: conscience_util.cpp:192
bool findSubString(const string str, const string sub)
Definition: conscience_util.cpp:327
Definition: conscience_util.h:220
Definition: conscience_util.h:607
const char * source
Definition: lz4.h:807
virtual const string & getErrorMessage() const
Definition: conscience_util.cpp:589
string truncateString(const string &input, size_t maxSize)
Definition: conscience_util.cpp:535
void pointee_type
Definition: conscience_util.h:207
string stringPadLeft(const string &input, size_t totalLength, char padChar)
Definition: conscience_util.cpp:692
const ptr< CscObjectModel > const string const CscPoint3d const CscPoint3d optional< double >
Definition: environmentObjectsCommands.h:367
constexpr bool IsTemplatedType
Definition: conscience_util.h:135
~CscException() noexcept override=default
CannotParseEnumException(const string &s)
Definition: conscience_util.h:222
Definition: CscEntityReflexion.h:50
vector< TValue > mapValuesConst(const map< TKey, const TValue > &theMap)
Definition: conscience_util.h:453
vector< const T * > * vectorOfPointerToConst(vector< T * > *theVector)
Definition: conscience_util.h:318
concept IsSharedPointer
Definition: conscience_util.h:218
Definition: json.hpp:4598
bool areMapsEqual(const map< TKey, TValue > &map1, const map< TKey, TValue > &map2)
Definition: conscience_util.h:429
void copy(const std::string &s, Iter oi)
Definition: picojson.h:525
unsigned long long diffMillis(system_clock::time_point timePoint1, system_clock::time_point timePoint2)
Definition: conscience_util.cpp:288
value::array array
Definition: picojson.h:209
Definition: conscience_util.h:167
vector< T > & vectorRemove(vector< T > &theVector, const T &item)
Definition: conscience_util.h:410
T vectorGetRandomElement(const std::vector< T > *vec)
Definition: conscience_util.h:680
CscException(const string &errorMessage) noexcept
Definition: conscience_util.cpp:582
float inchToCentimeter(float inchValue)
Definition: conscience_util.cpp:455
concept IsVector
Definition: conscience_util.h:147
const optional< K > keyOfValueInMap(const map< K, V > *map, V searchedValue)
Definition: conscience_util.h:419
#define ASSERT(MSG, EXPR)
Definition: conscience_util.h:43
double s
Definition: HybridAStar.cpp:85
string vectorToString(const vector< T > &vector, const char *separator=",")
Definition: conscience_util.h:302
concept IsPointerOf
Definition: conscience_util.h:129
string mapToString(const map< K, V > &theMap, const string &entriesSeparator=",", const string &keyValueSeparator="=")
Definition: conscience_util.h:502
string getStackTrace()
Definition: conscience_util.cpp:611
string toStringDateAndTime()
Definition: conscience_util.cpp:162
float * array
Definition: conscience_util.h:558
vector< int > * parseIntList(string input, char separator)
Definition: conscience_util.cpp:204
static constexpr bool isSharedPtr
Definition: conscience_util.h:206
string toLowerCase(string &str)
Definition: conscience_util.cpp:474
char * longToCharArray(long value)
Definition: conscience_util.cpp:406
static const string ALL_SPACES_STRING
Definition: conscience_util.h:225
bool equals(const map< K, V > &map1, const map< K, V > &map2)
Definition: conscience_util.h:527
string toUpperCase(string &str)
Definition: conscience_util.cpp:479
void pointee_type
Definition: conscience_util.h:169
bool stringContainsIgnoreCase(const string &theString, const string &searchedToken)
Definition: conscience_util.cpp:526
bool replaceInString(string &str, const string &from, const string &to, bool onlyFirst)
Definition: conscience_util.cpp:103
Definition: conscience_util.h:150
concept IsOptional
Definition: conscience_util.h:144
Definition: conscience_util.h:698
int i
Definition: HybridAStar.cpp:191