26 static constexpr auto DEFAULT_ROWS = 10u;
28 static constexpr auto DEFAULT_COLUMNS = 10u;
30 static constexpr auto DEFAULT_LEVELS = 1u;
32 static constexpr auto DEFAULT_BLOCK_ID = 0;
34 static constexpr auto DEFAULT_ALGO_ID = algo::BINARY_TREE;
36 static constexpr auto DEFAULT_SEED = 0u;
38 static constexpr auto DEFAULT_OUTPUT_ID = output_format::PLAIN_TEXT;
40 static constexpr auto DEFAULT_FILENAME =
"";
42 static constexpr auto DEFAULT_DISTANCES =
false;
44 static constexpr auto DEFAULT_DISTANCES_START = 0;
46 static constexpr auto DEFAULT_DISTANCES_END = -1;
48 static constexpr auto MAX_ROWS = 100u;
50 static constexpr auto MAX_COLUMNS = 100u;
52 static constexpr auto MAX_LEVELS = 10u;
61 m_rows = (
rows == 0) ? 1 : (
rows > MAX_ROWS) ? MAX_ROWS
73 m_columns = (
columns == 0) ? 1 : (
columns > MAX_COLUMNS) ? MAX_COLUMNS
87 m_levels = (
levels == 0) ? 1 : (
levels > MAX_LEVELS) ? MAX_LEVELS
97 m_algo_id = algorithm;
133 m_distances_start = start_index;
142 m_distances_end = end_index;
160 m_output_format_filename = std::move(filename);
166 unsigned int rows() const noexcept {
return m_rows.value_or(DEFAULT_ROWS); }
170 unsigned int columns() const noexcept {
return m_columns.value_or(DEFAULT_COLUMNS); }
174 unsigned int levels() const noexcept {
return m_levels.value_or(DEFAULT_LEVELS); }
178 algo algo_id() const noexcept {
return m_algo_id.value_or(DEFAULT_ALGO_ID); }
182 int block_id() const noexcept {
return m_block_id.value_or(DEFAULT_BLOCK_ID); }
186 unsigned int seed() const noexcept {
return m_seed.value_or(DEFAULT_SEED); }
190 bool distances() const noexcept {
return m_distances.value_or(DEFAULT_DISTANCES); }
194 int distances_start() const noexcept {
return m_distances_start.value_or(DEFAULT_DISTANCES_START); }
198 int distances_end() const noexcept {
return m_distances_end.value_or(DEFAULT_DISTANCES_END); }
206 std::string
output_format_filename() const noexcept {
return m_output_format_filename.value_or(std::string{ DEFAULT_FILENAME }); }
215 if (!m_rows.has_value() || !m_columns.has_value() || !m_levels.has_value())
222 if (m_rows.value() > MAX_ROWS || m_columns.value() > MAX_COLUMNS || m_levels.value() > MAX_LEVELS)
229 constexpr auto max_cells = std::numeric_limits<size_t>::max() /
sizeof(
void *);
231 if (
static_cast<size_t>(m_rows.value()) * m_columns.value() * m_levels.value() > max_cells)
245 if (config.
algo_id() == algo::DFS)
248 return std::make_optional(std::make_unique<dfs>());
250 else if (config.
algo_id() == algo::BINARY_TREE)
253 return std::make_optional(std::make_unique<binary_tree>());
255 else if (config.
algo_id() == algo::SIDEWINDER)
258 return std::make_optional(std::make_unique<sidewinder>());
265 std::optional<unsigned int> m_rows;
267 std::optional<unsigned int> m_columns;
269 std::optional<unsigned int> m_levels;
271 std::optional<int> m_block_id;
273 std::optional<algo> m_algo_id;
275 std::optional<unsigned int> m_seed;
277 std::optional<bool> m_distances;
279 std::optional<int> m_distances_start;
281 std::optional<int> m_distances_end;
283 std::optional<output_format> m_output_format_id;
285 std::optional<std::string> m_output_format_filename;
Configuration class for arguments.
Definition configurator.h:23
unsigned int seed() const noexcept
Get the random seed.
Definition configurator.h:186
unsigned int rows() const noexcept
Get the number of rows.
Definition configurator.h:166
configurator & columns(unsigned int columns) noexcept
Set the number of columns.
Definition configurator.h:70
configurator & output_format_filename(std::string filename) noexcept
Set the output_format filename.
Definition configurator.h:158
bool distances() const noexcept
Check if distances are calculated.
Definition configurator.h:190
configurator & block_id(int block_id) noexcept
Set the block ID.
Definition configurator.h:104
int block_id() const noexcept
Get the block ID.
Definition configurator.h:182
algo algo_id() const noexcept
Get the maze generation algorithm.
Definition configurator.h:178
bool is_valid() const noexcept
Validate all configuration values are within safe limits.
Definition configurator.h:211
configurator & levels(unsigned int levels) noexcept
Set the number of levels.
Definition configurator.h:83
configurator & distances(bool distances) noexcept
Set the distance calculation flag.
Definition configurator.h:122
configurator & algo_id(algo algorithm) noexcept
Set the maze generation algorithm.
Definition configurator.h:95
int distances_start() const noexcept
Get the distance start index.
Definition configurator.h:194
unsigned int levels() const noexcept
Get the number of levels.
Definition configurator.h:174
configurator & distances_end(int end_index) noexcept
Set the distance end index.
Definition configurator.h:140
configurator & seed(unsigned int seed) noexcept
Set the random seed.
Definition configurator.h:113
configurator & rows(unsigned int rows) noexcept
Set the number of rows.
Definition configurator.h:58
int distances_end() const noexcept
Get the distance end index.
Definition configurator.h:198
unsigned int columns() const noexcept
Get the number of columns.
Definition configurator.h:170
std::string output_format_filename() const noexcept
Get the output_format filename.
Definition configurator.h:206
static std::optional< std::unique_ptr< algo_interface > > make_algo_from_config(const configurator &config)
Determine the maze generation algorithm from the configuration.
Definition configurator.h:243
configurator & distances_start(int start_index) noexcept
Set the distance start index.
Definition configurator.h:131
output_format output_format_id() const noexcept
Get the output_format ID.
Definition configurator.h:202
configurator & output_format_id(output_format output_format) noexcept
Set the output_format ID.
Definition configurator.h:149
A class that manages distances associated with cells in a grid.
Definition distances.h:19
Enumerations and utilities for the maze builder program.
Namespace for the maze builder.
Definition algo_interface.h:6
algo
Enum class for maze types by the generating algorithm.
Definition enums.h:130
output_format
Enum class for output_format types.
Definition enums.h:30