aboutsummaryrefslogtreecommitdiff
path: root/build/operation
diff options
context:
space:
mode:
Diffstat (limited to 'build/operation')
-rw-r--r--build/operation70
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