Skip to content

Commit

Permalink
Better use of std::string_view
Browse files Browse the repository at this point in the history
  • Loading branch information
wichtounet committed Aug 6, 2023
1 parent bf5d2e0 commit b3e14cc
Show file tree
Hide file tree
Showing 7 changed files with 48 additions and 30 deletions.
2 changes: 1 addition & 1 deletion include/money.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -211,7 +211,7 @@ struct money {

// Official money parsing functions
std::string money_to_string(const money& amount);
money money_from_string(std::string money_string);
money money_from_string(std::string_view money_string);

std::ostream& operator<<(std::ostream& stream, const money& amount);

Expand Down
27 changes: 17 additions & 10 deletions include/utils.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@
#include <cctype>
#include <locale>
#include <iomanip>
#include <charconv>

#include "budget_exception.hpp"

namespace budget {

Expand All @@ -24,11 +27,12 @@ namespace budget {
* \return The converted text in the good type.
*/
template <typename T>
inline T to_number (const std::string& text) {
std::stringstream ss(text);
inline T to_number(std::string_view text) {
T result;
ss >> result;
return result;
if (auto [p, ec] = std::from_chars(text.data(), text.data() + text.size(), result); ec == std::errc()) {
return result;
}
throw budget::budget_exception("\"" + std::string(text) + "\" is not a valid number");
}

template<typename T>
Expand Down Expand Up @@ -58,13 +62,16 @@ void one_of(const std::string& value, const std::string& message, std::vector<st
unsigned short terminal_width();
unsigned short terminal_height();

std::vector<std::string> split(const std::string &s, char delim);
std::vector<std::string> &split(const std::string &s, char delim, std::vector<std::string> &elems);
std::vector<std::string> split(std::string_view s, char delim);
std::vector<std::string> &split(std::string_view s, char delim, std::vector<std::string> &elems);

std::vector<std::string_view> splitv(std::string_view s, char delim);
std::vector<std::string_view> &splitv(std::string_view s, char delim, std::vector<std::string_view> &elems);

std::string base64_decode(const std::string& in);
std::string base64_encode(const std::string& in);
std::string base64_decode(std::string_view in);
std::string base64_encode(std::string_view in);

std::string html_base64_decode(const std::string& in);
std::string html_base64_encode(const std::string& in);
std::string html_base64_decode(std::string_view in);
std::string html_base64_encode(std::string_view in);

} //end of namespace budget
4 changes: 2 additions & 2 deletions src/assets.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -618,7 +618,7 @@ void budget::migrate_assets_7_to_8(){
std::string assets_parts_str;
reader >> assets_parts_str;

auto assets_parts = split(assets_parts_str, ';');
auto assets_parts = splitv(assets_parts_str, ';');
for (size_t i = 0; i + 1 < assets_parts.size(); i += 2) {
auto id = to_number<size_t>(assets_parts[i]);
auto alloc = money_from_string(assets_parts[i + 1]);
Expand Down Expand Up @@ -670,7 +670,7 @@ void budget::asset::load(data_reader & reader){
std::string assets_parts_str;
reader >> assets_parts_str;

auto assets_parts = split(assets_parts_str, ';');
auto assets_parts = splitv(assets_parts_str, ';');
for (size_t i = 0; i + 1 < assets_parts.size(); i += 2) {
auto id = to_number<size_t>(assets_parts[i]);
auto alloc = money_from_string(assets_parts[i + 1]);
Expand Down
4 changes: 2 additions & 2 deletions src/currency.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -26,7 +26,7 @@ struct currency_cache_key {
std::string from;
std::string to;

currency_cache_key(budget::date date, std::string from, std::string to) : date(date), from(from), to(to) {}
currency_cache_key(budget::date date, std::string_view from, std::string_view to) : date(date), from(from), to(to) {}

friend bool operator<=>(const currency_cache_key & lhs, const currency_cache_key & rhs) = default;
};
Expand Down Expand Up @@ -124,7 +124,7 @@ void budget::load_currency_cache(){
continue;
}

auto parts = split(line, ':');
auto parts = splitv(line, ':');

currency_cache_key key(date_from_string(parts[0]), parts[1], parts[2]);
exchanges[key] = {budget::to_number<double>(parts[3]), true};
Expand Down
2 changes: 1 addition & 1 deletion src/liabilities.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -300,7 +300,7 @@ void budget::liability::load(data_reader & reader){
std::string assets_parts_str;
reader >> assets_parts_str;

auto assets_parts = split(assets_parts_str, ';');
auto assets_parts = splitv(assets_parts_str, ';');
for (size_t i = 0; i + 1 < assets_parts.size(); i += 2) {
auto id = to_number<size_t>(assets_parts[i]);
auto alloc = money_from_string(assets_parts[i + 1]);
Expand Down
4 changes: 2 additions & 2 deletions src/money.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@

using namespace budget;

money budget::money_from_string(std::string money_string){
money budget::money_from_string(std::string_view money_string){
int dollars = 0;
int cents = 0;

Expand All @@ -36,7 +36,7 @@ money budget::money_from_string(std::string money_string){
}
}

throw budget::budget_exception("\"" + money_string + "\" is not a valid amount of money");
throw budget::budget_exception("\"" + std::string(money_string) + "\" is not a valid amount of money");
}

std::string budget::money_to_string(const money& amount) {
Expand Down
35 changes: 23 additions & 12 deletions src/utils.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -51,22 +51,33 @@ unsigned short budget::terminal_height(){
#endif
}

std::vector<std::string>& budget::split(const std::string& s, char delim, std::vector<std::string>& elems) {
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
elems.push_back(item);
std::vector<std::string>& budget::split(std::string_view s, char delim, std::vector<std::string>& elems) {
for (auto element : s | std::ranges::views::split(delim)) {
elems.emplace_back(std::string_view(element));
}
return elems;
}

std::vector<std::string> budget::split(const std::string& s, char delim) {
std::vector<std::string> budget::split(std::string_view s, char delim) {
std::vector<std::string> elems;
split(s, delim, elems);
return elems;
}

std::string budget::base64_decode(const std::string& in) {
std::vector<std::string_view>& budget::splitv(std::string_view s, char delim, std::vector<std::string_view>& elems) {
for (auto element : s | std::ranges::views::split(delim)) {
elems.emplace_back(element);
}
return elems;
}

std::vector<std::string_view> budget::splitv(std::string_view s, char delim) {
std::vector<std::string_view> elems;
splitv(s, delim, elems);
return elems;
}

std::string budget::base64_decode(std::string_view in) {
// table from '+' to 'z'
const uint8_t lookup[] = {
62, 255, 62, 255, 63, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 255,
Expand Down Expand Up @@ -100,7 +111,7 @@ std::string budget::base64_decode(const std::string& in) {
return out;
}

std::string budget::base64_encode(const std::string& in){
std::string budget::base64_encode(std::string_view in){
std::string out;

std::string lookup = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";
Expand Down Expand Up @@ -129,16 +140,16 @@ std::string budget::base64_encode(const std::string& in){
return out;
}

std::string budget::html_base64_decode(const std::string& in) {
auto out = in;
std::string budget::html_base64_decode(std::string_view in) {
std::string out(in);

std::replace(out.begin(), out.end(), '_', '=');

return base64_decode(out);
}

std::string budget::html_base64_encode(const std::string& in){
auto out = base64_encode(in);
std::string budget::html_base64_encode(std::string_view in){
std::string out = base64_encode(in);

std::replace(out.begin(), out.end(), '=', '_');

Expand Down

0 comments on commit b3e14cc

Please sign in to comment.