diff options
author | Bardur Arantsson <bardur@scientician.net> | 2015-04-15 19:12:41 +0200 |
---|---|---|
committer | Bardur Arantsson <bardur@scientician.net> | 2015-04-15 19:12:41 +0200 |
commit | 8b2be5adc24ffdecc7bb5d8ed08be12a7590bc46 (patch) | |
tree | 52f137bd6e83baa12ad60b50c4710d04a7559cb2 /src/object_filter.hpp | |
parent | edede30a361f34d8c2f1d5de45adeac9392f41b9 (diff) |
Rework object list filters to avoid global variables
Diffstat (limited to 'src/object_filter.hpp')
-rw-r--r-- | src/object_filter.hpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/src/object_filter.hpp b/src/object_filter.hpp new file mode 100644 index 00000000..469b1fa6 --- /dev/null +++ b/src/object_filter.hpp @@ -0,0 +1,97 @@ +#pragma once + +#include "angband.h" +#include <functional> +#include <initializer_list> + +typedef std::function<bool (object_type const *)> object_filter_t; + +namespace object_filter { + +/** + * Is TVal equal to the given value? + */ +object_filter_t TVal(byte tval); + +/** + * Is SVal equal to the given value? + */ +object_filter_t SVal(byte sval); + +/** + * Has given bit mask in flag3 value. + */ +object_filter_t HasFlag3(u32b mask); + +/** + * Has given bit mask in flag4 value. + */ +object_filter_t HasFlag4(u32b mask); + +/** + * Has given bit mask in flag5 value. + */ +object_filter_t HasFlag5(u32b mask); + +/** + * Is the object an artifact? + */ +object_filter_t IsArtifact(); + +/** + * Is the object an artifact as determined by artifact_p? + */ +object_filter_t IsArtifactP(); + +/** + * Is the object an ego item? + */ +object_filter_t IsEgo(); + +/** + * Is the object "known"? + */ +object_filter_t IsKnown(); + +/** + * True always accepts all items. + */ +object_filter_t True(); + +/** + * Invert an object filter. + */ +object_filter_t Not(object_filter_t p); + +/** + * Logical conjunction (AND) + */ +object_filter_t And(); + +/** + * Logical conjunction (AND) + */ +template<typename Arg0, typename... Args> object_filter_t And(Arg0&& arg0, Args&&... args) { + auto argsFilter = And(args...); + return [=](object_type const *o_ptr) -> bool { + return arg0(o_ptr) && argsFilter(o_ptr); + }; +} + +/** + * Logical disjunction (OR) + */ +object_filter_t Or(); + +/** + * Logical disjunction (OR) + */ +template<typename Arg0, typename... Args> object_filter_t Or(Arg0&& arg0, Args&&... args) { + auto argsFilter = Or(args...); + return [=](object_type const *o_ptr) -> bool { + auto x = arg0(o_ptr) || argsFilter(o_ptr); + return x; + }; +} + +} |