std::invoke_result_t nest_pb_to_nest()

in src/cc/nest_serialize.h [48:69]


std::invoke_result_t<Function, rpcenv::NDArray*> nest_pb_to_nest(
    rpcenv::ArrayNest* nest_pb, Function array_to_nest) {
  using Nest = std::invoke_result_t<Function, rpcenv::NDArray*>;
  if (nest_pb->has_array()) {
    return array_to_nest(nest_pb->mutable_array());
  }
  if (nest_pb->vector_size() > 0) {
    std::vector<Nest> v;
    for (int i = 0, length = nest_pb->vector_size(); i < length; ++i) {
      v.push_back(nest_pb_to_nest(nest_pb->mutable_vector(i), array_to_nest));
    }
    return Nest(std::move(v));
  }
  if (nest_pb->map_size() > 0) {
    std::map<std::string, Nest> m;
    for (auto& p : *nest_pb->mutable_map()) {
      m[p.first] = nest_pb_to_nest(&p.second, array_to_nest);
    }
    return Nest(std::move(m));
  }
  throw std::invalid_argument("ArrayNest proto contained no data.");
}