aboutsummaryrefslogtreecommitdiffstats
path: root/al/eax_fx_slot_index.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'al/eax_fx_slot_index.cpp')
-rw-r--r--al/eax_fx_slot_index.cpp164
1 files changed, 164 insertions, 0 deletions
diff --git a/al/eax_fx_slot_index.cpp b/al/eax_fx_slot_index.cpp
new file mode 100644
index 00000000..dffaef47
--- /dev/null
+++ b/al/eax_fx_slot_index.cpp
@@ -0,0 +1,164 @@
+#include "eax_fx_slot_index.h"
+
+#include "eax_exception.h"
+
+
+namespace
+{
+
+
+class EaxFxSlotIndexException :
+ public EaxException
+{
+public:
+ explicit EaxFxSlotIndexException(
+ const char* message)
+ :
+ EaxException{"EAX_FX_SLOT_INDEX", message}
+ {
+ }
+}; // EaxFxSlotIndexException
+
+
+} // namespace
+
+
+EaxFxSlotIndex::EaxFxSlotIndex(
+ EaxFxSlotIndexValue index)
+{
+ set(index);
+}
+
+EaxFxSlotIndex::EaxFxSlotIndex(
+ const EaxFxSlotIndex& rhs) noexcept
+ :
+ has_value_{rhs.has_value_},
+ value_{rhs.value_}
+{
+}
+
+void EaxFxSlotIndex::operator=(
+ EaxFxSlotIndexValue index)
+{
+ set(index);
+}
+
+void EaxFxSlotIndex::operator=(
+ const GUID& guid)
+{
+ set(guid);
+}
+
+void EaxFxSlotIndex::operator=(
+ const EaxFxSlotIndex& rhs) noexcept
+{
+ has_value_ = rhs.has_value_;
+ value_ = rhs.value_;
+}
+
+bool EaxFxSlotIndex::has_value() const noexcept
+{
+ return has_value_;
+}
+
+EaxFxSlotIndexValue EaxFxSlotIndex::get() const
+{
+ if (!has_value_)
+ {
+ throw EaxFxSlotIndexException{"No value."};
+ }
+
+ return value_;
+}
+
+void EaxFxSlotIndex::reset() noexcept
+{
+ has_value_ = false;
+}
+
+void EaxFxSlotIndex::set(
+ EaxFxSlotIndexValue index)
+{
+ if (index >= static_cast<EaxFxSlotIndexValue>(EAX_MAX_FXSLOTS))
+ {
+ fail("Index out of range.");
+ }
+
+ has_value_ = true;
+ value_ = index;
+}
+
+void EaxFxSlotIndex::set(
+ const GUID& guid)
+{
+ if (false)
+ {
+ }
+ else if (guid == EAX_NULL_GUID)
+ {
+ has_value_ = false;
+ }
+ else if (guid == EAXPROPERTYID_EAX40_FXSlot0 || guid == EAXPROPERTYID_EAX50_FXSlot0)
+ {
+ has_value_ = true;
+ value_ = 0;
+ }
+ else if (guid == EAXPROPERTYID_EAX40_FXSlot1 || guid == EAXPROPERTYID_EAX50_FXSlot1)
+ {
+ has_value_ = true;
+ value_ = 1;
+ }
+ else if (guid == EAXPROPERTYID_EAX40_FXSlot2 || guid == EAXPROPERTYID_EAX50_FXSlot2)
+ {
+ has_value_ = true;
+ value_ = 2;
+ }
+ else if (guid == EAXPROPERTYID_EAX40_FXSlot3 || guid == EAXPROPERTYID_EAX50_FXSlot3)
+ {
+ has_value_ = true;
+ value_ = 3;
+ }
+ else
+ {
+ fail("Unsupported GUID.");
+ }
+}
+
+EaxFxSlotIndex::operator EaxFxSlotIndexValue() const
+{
+ return get();
+}
+
+[[noreturn]]
+void EaxFxSlotIndex::fail(
+ const char* message)
+{
+ throw EaxFxSlotIndexException{message};
+}
+
+
+bool operator==(
+ const EaxFxSlotIndex& lhs,
+ const EaxFxSlotIndex& rhs) noexcept
+{
+ if (lhs.has_value() != rhs.has_value())
+ {
+ return false;
+ }
+
+ if (lhs.has_value())
+ {
+ return lhs.get() == rhs.get();
+ }
+ else
+ {
+ return true;
+ }
+}
+
+bool operator!=(
+ const EaxFxSlotIndex& lhs,
+ const EaxFxSlotIndex& rhs) noexcept
+{
+ return !(lhs == rhs);
+}