src/main.h

changeset 200
ca23936b455b
parent 196
6bcb284679d4
child 205
1a4342d80de7
--- a/src/main.h	Wed May 25 20:36:34 2022 +0300
+++ b/src/main.h	Mon Jun 06 22:01:22 2022 +0300
@@ -34,78 +34,6 @@
 	constexpr char mainwindow[] = "mainwindow";
 }
 
-namespace ldraw
-{
-	class Object;
-
-	// Uniquely identifies a model body object
-	template<typename T>
-	struct Id
-	{
-		std::int32_t value;
-		template<typename A, typename B>
-		static constexpr bool is_base_or_base_of = std::disjunction_v<std::is_base_of<A, B>, std::is_base_of<B, A>>;
-		template<typename R, typename = std::enable_if_t<is_base_or_base_of<T, R>>>
-		constexpr bool operator<(ldraw::Id<R> other) const
-		{
-			return this->value < other.value;
-		}
-		friend constexpr unsigned int qHash(ldraw::Id<T> id)
-		{
-			return qHash(id.value);
-		}
-		// Allow comparing ids as long as they are related
-		template<typename R, typename = std::enable_if_t<is_base_or_base_of<T, R>>>
-		friend bool operator==(ldraw::Id<T> one, ldraw::Id<R> other)
-		{
-			return one.value == other.value;
-		}
-		// Allow upcasting
-		template<typename R, typename = std::enable_if_t<std::is_base_of_v<R, T>>>
-		constexpr operator Id<R>() const
-		{
-			return Id<R>{this->value};
-		}
-	};
-
-	using id_t = Id<Object>;
-	using triangleid_t = Id<class Triangle>;
-	using quadrilateralid_t = Id<class Quadrilateral>;
-	using edgeid_t = Id<class EdgeLine>;
-	using conditionaledgeid_t = Id<class ConditionalEdge>;
-	using subfileid_t = Id<class SubfileReference>;
-	using commentid_t = Id<class Comment>;
-	using metacommandid_t = Id<class MetaCommand>;
-
-	constexpr struct NullId
-	{
-		template<typename T>
-		constexpr operator Id<T>() const
-		{
-			return Id<T>{0};
-		}
-		static constexpr decltype(ldraw::id_t::value) value = 0;
-	} NULL_ID = {};
-
-	template<typename T>
-	inline bool operator==(Id<T> one, decltype(NULL_ID))
-	{
-		return one.value == 0;
-	}
-
-	template<typename T>
-	inline bool operator!=(Id<T> one, decltype(NULL_ID))
-	{
-		return one.value != 0;
-	}
-
-	template<typename T>
-	inline bool operator<(Id<T> one, decltype(NULL_ID))
-	{
-		return one.value < 0;
-	}
-}
-
 constexpr std::size_t operator""_z(const unsigned long long int x)
 {
 	return static_cast<std::size_t>(x);
@@ -262,8 +190,6 @@
 	return qHash(value.value);
 }
 
-using ModelId = TypeValue<int, struct TypeValueModelId>;
-
 /**
  * Iterates a @c glm::mat
  */
@@ -279,8 +205,15 @@
 	}
 }
 
-QDataStream& operator<<(QDataStream&, const glm::vec3&);
-QDataStream& operator>>(QDataStream&, glm::vec3&);
+inline QDataStream& operator<<(QDataStream& stream, const glm::vec3& vec)
+{
+	return stream << vec.x << vec.y << vec.z;
+}
+
+inline QDataStream& operator>>(QDataStream& stream, glm::vec3& vec)
+{
+	return stream >> vec.x >> vec.y >> vec.z;
+}
 
 template<int X, int Y, typename T, glm::qualifier Q>
 QDataStream& operator<<(QDataStream& stream, const glm::mat<X, Y, T, Q>& mat)
@@ -312,3 +245,27 @@
 	}
 	return result;
 }
+
+template<typename T>
+std::optional<T> pointerToOptional(const T* p)
+{
+	std::optional<T> result;
+	if (p != nullptr) {
+		result = *p;
+	}
+	return result;
+}
+
+template<typename T, typename R>
+void removeFromMap(std::map<T, R>& map, T&& key)
+{
+	const auto it = map.find(key);
+	if (it != map.end()) {
+		map.erase(it);
+	}
+}
+
+// some magic code from https://en.cppreference.com/w/cpp/utility/variant/visit
+// for use with std::visit
+template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
+template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;

mercurial