222 if (other.hasPredicate()) {
223 predicate_.reset(other.predicate_->clone());
227 template <
class Pred>
232 std::forward<Pred>(pred)))
242 if (rhs.hasPredicate()) {
243 predicate_.reset(rhs.predicate_->clone());
254 predicate_.reset(rhs.clone());
258 template <
class Pred>
263 std::make_unique<detail::DynamicPredicate<Tree, std::remove_cvref_t<Pred>>>(
264 std::forward<Pred>(pred));
270 if (rhs.hasPredicate()) {
271 if (hasPredicate()) {
272 *
this = (*
this && rhs);
274 predicate_.reset(rhs.predicate_->clone());
282 if (rhs.hasPredicate()) {
283 if (hasPredicate()) {
284 *
this = (*
this || rhs);
286 predicate_.reset(rhs.predicate_->clone());
292 [[nodiscard]]
bool hasPredicate()
const {
return !!predicate_; }
294 void init(
Tree const& t)
296 if (hasPredicate()) {
301 [[nodiscard]]
bool returnableValue(
typename Tree::value_type
const& v)
const
302 requires requires {
typename Tree::value_type; }
304 return !hasPredicate() || predicate_->returnableValue(v);
307 [[nodiscard]]
bool returnable(
Tree const& t,
typename Tree::Node const& n)
const
309 return !hasPredicate() || predicate_->returnable(t, n);
312 [[nodiscard]]
bool traversable(
Tree const& t,
typename Tree::Node const& n)
const
314 return !hasPredicate() || predicate_->traversable(t, n);
317 [[nodiscard]]
bool returnableRay(
Tree const& t,
typename Tree::Node const& n,
320 return !hasPredicate() || predicate_->returnableRay(t, n, r);
323 [[nodiscard]]
bool traversableRay(
Tree const& t,
typename Tree::Node const& n,
326 return !hasPredicate() || predicate_->traversableRay(t, n, r);
330 std::unique_ptr<detail::Dynamic<Tree>> predicate_;