diff --git a/tools/pioasm/main.cpp b/tools/pioasm/main.cpp index 0d402cd..1c86bea 100644 --- a/tools/pioasm/main.cpp +++ b/tools/pioasm/main.cpp @@ -18,7 +18,7 @@ void usage() { std::cerr << "\n"; std::cerr << "options:\n"; std::cerr << " -o select output_format (default '" << DEFAULT_OUTPUT_FORMAT << "'); available options are:\n"; - for(const auto& f : output_format::output_formats) { + for(const auto& f : output_format::all()) { std::cerr << " " << f->name << std::endl; std::cerr << " " << f->get_description() << std::endl; } @@ -79,11 +79,11 @@ int main(int argc, char *argv[]) { } std::shared_ptr oformat; if (!res) { - const auto& e = std::find_if(output_format::output_formats.begin(), output_format::output_formats.end(), + const auto& e = std::find_if(output_format::all().begin(), output_format::all().end(), [&](const std::shared_ptr &f) { return f->name == format; }); - if (e == output_format::output_formats.end()) { + if (e == output_format::all().end()) { std::cerr << "error: unknown output format '" << format << "'" << std::endl; res = 1; } else { diff --git a/tools/pioasm/output_format.h b/tools/pioasm/output_format.h index 7d49a00..2ba899d 100644 --- a/tools/pioasm/output_format.h +++ b/tools/pioasm/output_format.h @@ -77,13 +77,12 @@ struct compiled_source { }; struct output_format { - static std::vector> output_formats; static std::string default_name; std::string name; static void add(output_format *lang) { - output_formats.push_back(std::shared_ptr(lang)); + all().push_back(std::shared_ptr(lang)); } virtual int output(std::string destination, std::vector output_options, @@ -93,6 +92,11 @@ struct output_format { FILE *open_single_output(std::string destination); virtual ~output_format() = default; + + static std::vector>& all() { + static std::vector> output_formats; + return output_formats; + } protected: output_format(std::string name) : name(std::move(name)) {} }; diff --git a/tools/pioasm/pio_assembler.cpp b/tools/pioasm/pio_assembler.cpp index a6d0b9e..7a83831 100644 --- a/tools/pioasm/pio_assembler.cpp +++ b/tools/pioasm/pio_assembler.cpp @@ -15,7 +15,6 @@ using syntax_error = yy::parser::syntax_error; -std::vector> output_format::output_formats; std::string output_format::default_name = "c-sdk"; pio_assembler::pio_assembler() { @@ -324,7 +323,7 @@ std::vector pio_assembler::public_symbols(program &prog int pio_assembler::write_output() { std::set known_output_formats; - std::transform(output_format::output_formats.begin(), output_format::output_formats.end(), + std::transform(output_format::all().begin(), output_format::all().end(), std::inserter(known_output_formats, known_output_formats.begin()), [&](std::shared_ptr &f) { return f->name;