Commit 84cb2ee4 authored by Alvarez, Gonzalo's avatar Alvarez, Gonzalo
Browse files

IsEnumClass predicate; IoNg: write/read enum class

parent 694672b0
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -43,10 +43,13 @@ typedef unsigned int SizeType;

namespace PsimagLite {

template <typename T, bool B = std::is_enum<T>::value>
struct IsEnumClass : std::false_type {};

template <typename T>
struct IsEnum {
	enum {True = __is_enum(T)};
};
struct IsEnumClass<T, true>
: std::integral_constant<bool,
    !std::is_convertible<T, typename std::underlying_type<T>::type>::value> {};

inline div_t div(int a, int b) { return std::div(a, b); }

+2 −1
Original line number Diff line number Diff line
@@ -110,7 +110,8 @@ struct IsRootUnDelegated {
		  IsVectorLike<T>::True ||
		  IsStackLike<T>::True ||
		  IsPairLike<T>::True ||
		  IsEnum<T>::True ||
		  std::is_enum<T>::value ||
		  IsEnumClass<T>::value ||
		  IsStringLike<T>::True};
};
// PSIDOC_CODE_END
+35 −6
Original line number Diff line number Diff line
@@ -138,7 +138,8 @@ public:
	void write(String name2,
	           const T& what,
	           WriteMode allowOverwrite = NO_OVERWRITE,
	           typename EnableIf<Loki::TypeTraits<T>::isArith || IsEnum<T>::True, int*>::Type = 0)
	           typename EnableIf<Loki::TypeTraits<T>::isArith ||
	           std::is_enum<T>::value, int*>::Type = 0)
	{
		String name = "Def/" + name2;
		const void* ptr = static_cast<const T*>(&what);
@@ -303,9 +304,9 @@ public:
	template<typename T>
	void write(String name2,
	           const std::vector<T>& what,
	           WriteMode allowOverwrite = NO_OVERWRITE,
	           WriteMode = NO_OVERWRITE,
	           typename EnableIf<!Loki::TypeTraits<typename Real<T>::Type>::isArith
	           && !IsPairLike<T>::True, int*>::Type = 0)
	           && !IsPairLike<T>::True && !IsEnumClass<T>::value, int*>::Type = 0)
	{
		SizeType n = what.size();
		createGroup(name2);
@@ -314,6 +315,20 @@ public:
			what[i].write(name2 + "/" + typeToString(i), *this);
	}

	template<typename T>
	void write(String name2,
	           const std::vector<T>& what,
	           WriteMode allowOverwrite = NO_OVERWRITE,
	           typename EnableIf<IsEnumClass<T>::value, int*>::Type = 0)
	{
		overwriteNotSupported(allowOverwrite);
		SizeType n = what.size();
		createGroup(name2);
		write(name2 + "/Size", n);
		for (SizeType i = 0; i < n; ++i)
			write(name2 + "/" + typeToString(i), what[i]);
	}

	template<typename T>
	void overwrite(String name2,
	               const std::vector<T>& what,
@@ -376,7 +391,8 @@ public:
	template<typename SomeType>
	void read(SomeType& value,
	          String name,
	          typename EnableIf<Loki::TypeTraits<SomeType>::isArith, int*>::Type = 0)
	          typename EnableIf<Loki::TypeTraits<SomeType>::isArith &&
	          !std::is_enum<SomeType>::value, int*>::Type = 0)
	{
		void* ptr = static_cast<void *>(&value);
		H5::DataSet* dataset = new H5::DataSet(hdf5file_->openDataSet("Def/" + name));
@@ -432,7 +448,8 @@ public:
	template<typename SomeType>
	void read(SomeType& value,
	          String name,
	          typename EnableIf<IsEnum<SomeType>::True, int*>::Type = 0)
	          typename EnableIf<std::is_enum<SomeType>::value ||
	          IsEnumClass<SomeType>::value, int*>::Type = 0)
	{
		SizeType x = 0;
		read(x, name);
@@ -473,7 +490,7 @@ public:
	void read(std::vector<T>& what,
	          String name,
	          typename EnableIf<!Loki::TypeTraits<typename Real<T>::Type>::isArith
	          && !IsPairLike<T>::True, int*>::Type = 0)
	          && !IsPairLike<T>::True && !IsEnumClass<T>::value, int*>::Type = 0)
	{
		SizeType size = 0;
		read(size, name + "/Size");
@@ -495,6 +512,18 @@ public:
			read(what[i], name + "/" + ttos(i));
	}

	template<typename T>
	void read(std::vector<T>& what,
	          String name,
	          typename EnableIf<IsEnumClass<T>::value, int*>::Type = 0)
	{
		SizeType size = 0;
		read(size, name + "/Size");
		what.resize(size);
		for (SizeType i = 0; i < size; ++i)
			read(what[i], name + "/" + ttos(i));
	}

	template<typename T>
	void read(std::vector<std::vector<T> >& what,
	          String name)
+1 −1
Original line number Diff line number Diff line
@@ -95,7 +95,7 @@ class IoSimple {

	template<typename T>
	struct PrintWithEqualSign {
		enum { True = Loki::TypeTraits<T>::isArith ||IsEnum<T>::True };
		enum { True = Loki::TypeTraits<T>::isArith || std::is_enum<T>::value };
	};

public:
+2 −2
Original line number Diff line number Diff line
@@ -6,10 +6,10 @@
namespace PsimagLite {

template<typename T>
typename EnableIf<!IsEnum<T>::True, H5::PredType>::Type typeToH5();
typename EnableIf<!std::is_enum<T>::value, H5::PredType>::Type typeToH5();

template<typename T>
typename EnableIf<IsEnum<T>::True, H5::PredType>::Type typeToH5()
typename EnableIf<std::is_enum<T>::value, H5::PredType>::Type typeToH5()
{
	return H5::PredType::NATIVE_UINT8;
}
Loading