From 06f733e02f6a7bfd5ad53edcc72cca2c7f6ca49e Mon Sep 17 00:00:00 2001 From: teoionescu Date: Mon, 20 Jan 2025 21:59:10 +0100 Subject: [PATCH] Improve locale set/unset in table_internal.hpp; This is more multithreading friendly, avoiding potential race conditions on overwriting locale::global. --- include/tabulate/table_internal.hpp | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-) diff --git a/include/tabulate/table_internal.hpp b/include/tabulate/table_internal.hpp index 7e8652d..864f7da 100644 --- a/include/tabulate/table_internal.hpp +++ b/include/tabulate/table_internal.hpp @@ -297,7 +297,8 @@ inline void Printer::print_row_in_cell(std::ostream &stream, TableInternal &tabl auto cell = table[index.first][index.second]; auto locale = cell.locale(); auto is_multi_byte_character_support_enabled = cell.is_multi_byte_character_support_enabled(); - auto old_locale = std::locale::global(std::locale(locale)); + auto old_locale = std::locale(); + stream.imbue(std::locale(locale)); auto format = cell.format(); auto text_height = splitted_cell_text.size(); auto padding_top = *format.padding_top_; @@ -377,7 +378,7 @@ inline void Printer::print_row_in_cell(std::ostream &stream, TableInternal &tabl reset_element_style(stream); } } - std::locale::global(old_locale); + stream.imbue(old_locale); } inline bool Printer::print_cell_border_top(std::ostream &stream, TableInternal &table, @@ -386,7 +387,8 @@ inline bool Printer::print_cell_border_top(std::ostream &stream, TableInternal & size_t num_columns) { auto cell = table[index.first][index.second]; auto locale = cell.locale(); - auto old_locale = std::locale::global(std::locale(locale)); + auto old_locale = std::locale(); + stream.imbue(std::locale(locale)); auto format = cell.format(); auto column_width = dimension.second; @@ -439,7 +441,7 @@ inline bool Printer::print_cell_border_top(std::ostream &stream, TableInternal & stream << corner; reset_element_style(stream); } - std::locale::global(old_locale); + stream.imbue(old_locale); return true; } @@ -449,7 +451,8 @@ inline bool Printer::print_cell_border_bottom(std::ostream &stream, TableInterna size_t num_columns) { auto cell = table[index.first][index.second]; auto locale = cell.locale(); - auto old_locale = std::locale::global(std::locale(locale)); + auto old_locale = std::locale(); + stream.imbue(std::locale(locale)); auto format = cell.format(); auto column_width = dimension.second; @@ -482,7 +485,7 @@ inline bool Printer::print_cell_border_bottom(std::ostream &stream, TableInterna stream << corner; reset_element_style(stream); } - std::locale::global(old_locale); + stream.imbue(old_locale); return true; }