summaryrefslogtreecommitdiffstats
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--src/common/bit_field.h19
-rw-r--r--src/common/string_util.cpp57
-rw-r--r--src/common/string_util.h33
3 files changed, 12 insertions, 97 deletions
diff --git a/src/common/bit_field.h b/src/common/bit_field.h
index bf803da8d..21e07925d 100644
--- a/src/common/bit_field.h
+++ b/src/common/bit_field.h
@@ -117,21 +117,21 @@ private:
// We don't delete it because we want BitField to be trivially copyable.
constexpr BitField& operator=(const BitField&) = default;
- // StorageType is T for non-enum types and the underlying type of T if
+ // UnderlyingType is T for non-enum types and the underlying type of T if
// T is an enumeration. Note that T is wrapped within an enable_if in the
// former case to workaround compile errors which arise when using
// std::underlying_type<T>::type directly.
- using StorageType = typename std::conditional_t<std::is_enum<T>::value, std::underlying_type<T>,
- std::enable_if<true, T>>::type;
+ using UnderlyingType = typename std::conditional_t<std::is_enum_v<T>, std::underlying_type<T>,
+ std::enable_if<true, T>>::type;
- // Unsigned version of StorageType
- using StorageTypeU = std::make_unsigned_t<StorageType>;
+ // We store the value as the unsigned type to avoid undefined behaviour on value shifting
+ using StorageType = std::make_unsigned_t<UnderlyingType>;
public:
/// Constants to allow limited introspection of fields if needed
static constexpr std::size_t position = Position;
static constexpr std::size_t bits = Bits;
- static constexpr StorageType mask = (((StorageTypeU)~0) >> (8 * sizeof(T) - bits)) << position;
+ static constexpr StorageType mask = (((StorageType)~0) >> (8 * sizeof(T) - bits)) << position;
/**
* Formats a value by masking and shifting it according to the field parameters. A value
@@ -148,11 +148,12 @@ public:
* union in a constexpr context.
*/
static constexpr FORCE_INLINE T ExtractValue(const StorageType& storage) {
- if (std::numeric_limits<T>::is_signed) {
+ if constexpr (std::numeric_limits<UnderlyingType>::is_signed) {
std::size_t shift = 8 * sizeof(T) - bits;
- return (T)((storage << (shift - position)) >> shift);
+ return static_cast<T>(static_cast<UnderlyingType>(storage << (shift - position)) >>
+ shift);
} else {
- return (T)((storage & mask) >> position);
+ return static_cast<T>((storage & mask) >> position);
}
}
diff --git a/src/common/string_util.cpp b/src/common/string_util.cpp
index 731d1db34..14f7037d8 100644
--- a/src/common/string_util.cpp
+++ b/src/common/string_util.cpp
@@ -4,11 +4,10 @@
#include <algorithm>
#include <cctype>
-#include <cerrno>
#include <codecvt>
-#include <cstdio>
#include <cstdlib>
-#include <cstring>
+#include <locale>
+#include <sstream>
#include "common/common_paths.h"
#include "common/logging/log.h"
#include "common/string_util.h"
@@ -33,24 +32,6 @@ std::string ToUpper(std::string str) {
return str;
}
-// For Debugging. Read out an u8 array.
-std::string ArrayToString(const u8* data, std::size_t size, int line_len, bool spaces) {
- std::ostringstream oss;
- oss << std::setfill('0') << std::hex;
-
- for (int line = 0; size; ++data, --size) {
- oss << std::setw(2) << (int)*data;
-
- if (line_len == ++line) {
- oss << '\n';
- line = 0;
- } else if (spaces)
- oss << ' ';
- }
-
- return oss.str();
-}
-
std::string StringFromBuffer(const std::vector<u8>& data) {
return std::string(data.begin(), std::find(data.begin(), data.end(), '\0'));
}
@@ -75,40 +56,6 @@ std::string StripQuotes(const std::string& s) {
return s;
}
-bool TryParse(const std::string& str, u32* const output) {
- char* endptr = nullptr;
-
- // Reset errno to a value other than ERANGE
- errno = 0;
-
- unsigned long value = strtoul(str.c_str(), &endptr, 0);
-
- if (!endptr || *endptr)
- return false;
-
- if (errno == ERANGE)
- return false;
-
-#if ULONG_MAX > UINT_MAX
- if (value >= 0x100000000ull && value <= 0xFFFFFFFF00000000ull)
- return false;
-#endif
-
- *output = static_cast<u32>(value);
- return true;
-}
-
-bool TryParse(const std::string& str, bool* const output) {
- if ("1" == str || "true" == ToLower(str))
- *output = true;
- else if ("0" == str || "false" == ToLower(str))
- *output = false;
- else
- return false;
-
- return true;
-}
-
std::string StringFromBool(bool value) {
return value ? "True" : "False";
}
diff --git a/src/common/string_util.h b/src/common/string_util.h
index 32bf6a19c..08f96533b 100644
--- a/src/common/string_util.h
+++ b/src/common/string_util.h
@@ -5,8 +5,6 @@
#pragma once
#include <cstddef>
-#include <iomanip>
-#include <sstream>
#include <string>
#include <vector>
#include "common/common_types.h"
@@ -19,44 +17,13 @@ std::string ToLower(std::string str);
/// Make a string uppercase
std::string ToUpper(std::string str);
-std::string ArrayToString(const u8* data, std::size_t size, int line_len = 20, bool spaces = true);
-
std::string StringFromBuffer(const std::vector<u8>& data);
std::string StripSpaces(const std::string& s);
std::string StripQuotes(const std::string& s);
-// Thousand separator. Turns 12345678 into 12,345,678
-template <typename I>
-std::string ThousandSeparate(I value, int spaces = 0) {
- std::ostringstream oss;
-
-// std::locale("") seems to be broken on many platforms
-#if defined _WIN32 || (defined __linux__ && !defined __clang__)
- oss.imbue(std::locale(""));
-#endif
- oss << std::setw(spaces) << value;
-
- return oss.str();
-}
-
std::string StringFromBool(bool value);
-bool TryParse(const std::string& str, bool* output);
-bool TryParse(const std::string& str, u32* output);
-
-template <typename N>
-static bool TryParse(const std::string& str, N* const output) {
- std::istringstream iss(str);
-
- N tmp = 0;
- if (iss >> tmp) {
- *output = tmp;
- return true;
- } else
- return false;
-}
-
std::string TabsToSpaces(int tab_size, std::string in);
void SplitString(const std::string& str, char delim, std::vector<std::string>& output);