#pragma once #include "h-basic.h" #include "object_type_fwd.hpp" #include #include typedef std::function 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 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 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; }; } }