Skip to content

rfl::DefaultIfMissing processor + Reflector<FixedVector> #260

Closed
@AnsiV01

Description

@AnsiV01

Hello

I am working on a mini-game where I am using reflect-cpp as a parser for json files and more. At some point I needed to implement support for a custom FixedVector class from the fixed_container library (https://github.com/teslamotors/fixed-containers). And here I ran into a problem, because the compiler cannot handle this class if I add a DefaultIfMissing processor when using rfl::json::(read/load). Below MRE.

#include <rfl/json.hpp>
#include <rfl/parsing/CustomParser.hpp>
#include <fixed_containers/fixed_string.hpp>

namespace rfl
{
	template <typename T, size_t Size>
	struct Reflector<fixed_containers::FixedVector<T, Size>>
	{
		using ReflType = std::vector<T>;
		static constexpr fixed_containers::FixedVector<T, Size> to(const ReflType& v)
		{
			if (v.size() > Size)
				throw std::exception("v.size() > Size");

			fixed_containers::FixedVector<T, Size> cont{};
			cont.assign(v.begin(), v.end());
			return cont;
		}

		static constexpr ReflType from(const fixed_containers::FixedVector<T, Size>& v)
		{
			ReflType cont{};
			cont.assign(v.begin(), v.end());
			return cont;
		}
	};
}

enum class Attributes
{
	NONE,
	MOVE_SPEED,
	ATTACK_SPEED,
	MAX_HP,
	MAX_MP,
};

struct Data
{
	fixed_containers::FixedVector<std::pair<Attributes, long long>, 3> attributes{};
};

int main()
{
	auto json1 = rfl::json::read<Data>(""); //this is OK
	auto json2 = rfl::json::load<Data>("data.json"); // this is OK

	auto json3 = rfl::json::read<Data, rfl::DefaultIfMissing>(""); //this fail
	auto json4 = rfl::json::load<Data, rfl::DefaultIfMissing>("data.json"); // this fail
}

The compiler (MSVC) reports a problem with the use of the deleted function:

Błąd C2280 „fixed_containers::FixedVector<std::pair<Attributes,__int64>,3,fixed_containers::customize::SequenceContainerAbortChecking<T,3>> &fixed_containers::FixedVector<T,3,fixed_containers::customize::SequenceContainerAbortChecking<T,3>>::operator =(const fixed_containers::FixedVector<T,3,fixed_containers::customize::SequenceContainerAbortChecking<T,3>> &)”: próba odwania do usuniętej funkcji with [ T=std::pair<Attributes,__int64> ] 121 E:\ecpp\ecpp\_third\rfl\parsing\ViewReaderWithDefault.hpp

And when I click on the error it redirects me to this code from the rfl\parsing\ViewReaderWithDefault.hpp:

template <class Target, class Source>
static void move_to(Target* _t, Source* _s) {
  if constexpr (std::is_const_v<Target>) {
    return move_to(const_cast<std::remove_const_t<Target>*>(_t), _s);
  } else if constexpr (!rfl::internal::is_array_v<Source> &&
                       !std::is_array_v<Target>) {
    *_t = Target(std::move(*_s));            <<-- ERROR HAPPENED HERE
  } else if constexpr (rfl::internal::is_array_v<Source>) {
    static_assert(std::is_array_v<Target>,
                  "Expected target to be a c-array.");
    for (size_t i = 0; i < _s->arr_.size(); ++i) {
      move_to(&((*_t)[i]), &(_s->arr_[i]));
    }
  } else {
    for (size_t i = 0; i < _s->size(); ++i) {
      move_to(&((*_t)[i]), &((*_s)[i]));
    }
  }
}

My question is whether there is a workaround or fix for this situation, or whether this is a problem that cannot be circumvented by the way the fixed_container library is implemented?

Thanks for any information.

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions