Commit f8af14f1 authored by Paul Asmuth's avatar Paul Asmuth
Browse files

configure_multiprop -> expr_calln

parent 9c774977
Loading
Loading
Loading
Loading
+0 −11
Original line number Diff line number Diff line
@@ -38,17 +38,6 @@ using namespace std::placeholders;
namespace plotfx {

/*
ParserFn configure_multiprop(const std::vector<ParserFn>& parsers) {
  return [parsers] (const Expr* prop) -> ReturnCode {
    for (const auto& p : parsers) {
      if (auto rc = p(prop); !rc) {
        return rc;
      }
    }

    return OK;
  };
}

ParserFn configure_alt(const ParserDefinitions& parsers) {
  return [parsers] (const Expr* prop) -> ReturnCode {
+22 −6
Original line number Diff line number Diff line
@@ -29,21 +29,21 @@
 */
#include "sexpr_util.h"

using namespace std::placeholders;

namespace plotfx {

ReturnCode expr_walk_map(
    const Expr* expr,
    const std::unordered_map<
        std::string,
        std::function<ReturnCode (const Expr*)>>& pdefs) {
    const std::unordered_map<std::string, ExprVisitor>& fns) {
  for (; expr; expr = expr_next(expr)) {
    if (!expr_is_value_literal(expr)) {
      return ReturnCode::error("EARG", "expected a literal");
    }

    auto param = expr_get_value(expr);
    const auto& pdef = pdefs.find(param);
    if (pdef == pdefs.end()) {
    const auto& fn = fns.find(param);
    if (fn == fns.end()) {
      return ReturnCode::errorf("EARG", "invalid paramter: '$0'", param);
    }

@@ -51,7 +51,7 @@ ReturnCode expr_walk_map(
      return ReturnCode::errorf("EARG", "expected an argument for '$0'", param);
    }

    if (auto rc = pdef->second(expr); !rc.isSuccess()) {
    if (auto rc = fn->second(expr); !rc.isSuccess()) {
      return ReturnCode::errorf(
          "EPARSE",
          "error while parsing property '$0': $1",
@@ -65,6 +65,22 @@ ReturnCode expr_walk_map(
  return OK;
}

ReturnCode expr_calln(
    const Expr* expr,
    const std::initializer_list<ExprVisitor>& fns) {
  for (const auto& fn : fns) {
    if (auto rc = fn(expr); !rc) {
      return rc;
    }
  }

  return OK;
}

ExprVisitor expr_calln_fn(const std::initializer_list<ExprVisitor>& fns) {
  return bind(&expr_calln, _1, fns);
}

} // namespace plotfx

+9 −3
Original line number Diff line number Diff line
@@ -35,11 +35,17 @@

namespace plotfx {

using ExprVisitor = std::function<ReturnCode (const Expr*)>;

ReturnCode expr_walk_map(
    const Expr* expr,
    const std::unordered_map<
        std::string,
        std::function<ReturnCode (const Expr*)>>& pdefs);
    const std::unordered_map<std::string, ExprVisitor>& fns);

ReturnCode expr_calln(
    const Expr* expr,
    const std::initializer_list<ExprVisitor>& fns);

ExprVisitor expr_calln_fn(const std::initializer_list<ExprVisitor>& fns);

} // namespace plotfx