diff options
Diffstat (limited to 'build/operation')
-rw-r--r-- | build/operation | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/build/operation b/build/operation new file mode 100644 index 0000000..3398f32 --- /dev/null +++ b/build/operation @@ -0,0 +1,70 @@ +// file : build/operation -*- C++ -*- +// copyright : Copyright (c) 2014-2015 Code Synthesis Tools CC +// license : MIT; see accompanying LICENSE file + +#ifndef BUILD_OPERATION +#define BUILD_OPERATION + +#include <string> +#include <cstdint> +#include <iosfwd> + +#include <build/utility> // string_table + +namespace build +{ + // While we are using uint8_t for the meta/operation ids, we assume + // that each is limited to 4 bits (max 128 entries) so that we can + // store the combined action id in uint8_t as well. This makes our + // life easier when it comes to defining switch labels for action + // ids (no need to mess with endian-ness). + // + // Note that 0 is not a valid meta/operation/action id. + // + using meta_operation_id = std::uint8_t; + using operation_id = std::uint8_t; + using action_id = std::uint8_t; + + struct action + { + action (meta_operation_id m, operation_id o): id ((m << 4) | o) {} + + meta_operation_id + meta_operation () const {return id >> 4;} + + operation_id + operation () const {return id & 0xF;} + + // Implicit conversion operator to action_id for the switch() + // statement, etc. + // + operator action_id () const {return id;} + + action_id id; + }; + + std::ostream& + operator<< (std::ostream&, action); + + // Id constants for build-in operations. + // + const meta_operation_id perform_id = 1; + const meta_operation_id configure_id = 2; + const meta_operation_id disfigure_id = 3; + + const operation_id update_id = 1; + const operation_id clean_id = 2; + + const action_id perform_update_id = (perform_id << 4) | update_id; + const action_id perform_clean_id = (perform_id << 4) | clean_id; + + // Meta/operation id tables. + // + using meta_operation_table = string_table<meta_operation_id>; + using operation_table = string_table<operation_id>; + + extern meta_operation_table meta_operations; + extern operation_table operations; +} + +#endif // BUILD_OPERATION |