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

add expr_unwrap, expr_to_stringset

parent 8d855a7b
Loading
Loading
Loading
Loading
+22 −0
Original line number Diff line number Diff line
@@ -38,6 +38,28 @@ ReturnCode expr_to_strings(
  return expr_tov<std::string>(expr, bind(&expr_to_string, _1, _2), values);
}

ReturnCode expr_to_stringset(
    const Expr* expr,
    std::set<std::string>* values) {
  if (!expr || !expr_is_list(expr)) {
    return errorf(
        ERROR,
        "argument error; expected a list, got: {}",
        expr_inspect(expr)); // FIXME
  }

  for (expr = expr_get_list(expr); expr; expr = expr_next(expr)) {
    std::string v;
    if (auto rc = expr_to_string(expr, &v); !rc) {
      return rc;
    }

    values->insert(std::move(v));
  }

  return OK;
}

ReturnCode expr_to_float64(
    const Expr* expr,
    double* value) {
+4 −0
Original line number Diff line number Diff line
@@ -32,6 +32,10 @@ ReturnCode expr_to_strings(
    const Expr* expr,
    std::vector<std::string>* values);

ReturnCode expr_to_stringset(
    const Expr* expr,
    std::set<std::string>* values);

ReturnCode expr_to_float64(
    const Expr* expr,
    double* value);
+8 −0
Original line number Diff line number Diff line
@@ -89,6 +89,14 @@ std::vector<ExprStorage> expr_clonev(const std::vector<ExprStorage>& exprs) {
  return out;
}

ExprStorage expr_unwrap(ExprStorage expr) {
  if (expr && expr_is_list(expr.get())) {
    return std::move(*expr_get_list_storage(expr.get()));
  }

  return expr;
}

} // namespace fviz

+2 −0
Original line number Diff line number Diff line
@@ -43,6 +43,8 @@ ExprStorage expr_build(T&&... items);

std::vector<ExprStorage> expr_clonev(const std::vector<ExprStorage>& exprs);

ExprStorage expr_unwrap(ExprStorage expr);

} // namespace fviz

#include "sexpr_util_impl.h"