--- /dev/null
+#pragma once
+
+#include <algorithm>
+#include "Vector.hxx"
+
+namespace std
+{
+ // --- minimum ---
+
+ template <typename T>
+ Vector2<T> min(const Vector2<T>& vec1, const Vector2<T>& vec2)
+ {
+ return {std::min(vec1.x, vec2.x), std::min(vec1.y, vec2.y)};
+ }
+
+ template <typename T>
+ Vector2<T> min(const Vector2<T>& vec1, const Vector2<T>& vec2, const Vector2<T>& vec3)
+ {
+ return std::min(std::min(vec1, vec2), std::min(vec2, vec3));
+ }
+
+ template <typename T>
+ Vector3<T> min(const Vector3<T>& vec1, const Vector3<T>& vec2)
+ {
+ return {std::min(vec1.x, vec2.x), std::min(vec1.y, vec2.y), std::min(vec1.z, vec2.z)};
+ }
+
+ template <typename T>
+ Vector3<T> min(const Vector3<T>& vec1, const Vector3<T>& vec2, const Vector3<T>& vec3)
+ {
+ return std::min(std::min(vec1, vec2), std::min(vec2, vec3));
+ }
+
+ template <typename T>
+ Vector4<T> min(const Vector4<T>& vec1, const Vector4<T>& vec2)
+ {
+ return {std::min(vec1.x, vec2.x), std::min(vec1.y, vec2.y), std::min(vec1.z, vec2.z), std::min(vec1.w, vec2.w)};
+ }
+
+ template <typename T>
+ Vector4<T> min(const Vector4<T>& vec1, const Vector4<T>& vec2, const Vector4<T>& vec3)
+ {
+ return std::min(std::min(vec1, vec2), std::min(vec2, vec3));
+ }
+
+ // --- maximum ---
+
+ template <typename T>
+ Vector2<T> max(const Vector2<T>& vec1, const Vector2<T>& vec2)
+ {
+ return {std::max(vec1.x, vec2.x), std::max(vec1.y, vec2.y)};
+ }
+
+ template <typename T>
+ Vector2<T> max(const Vector2<T>& vec1, const Vector2<T>& vec2, const Vector2<T>& vec3)
+ {
+ return std::max(std::max(vec1, vec2), std::max(vec2, vec3));
+ }
+
+ template <typename T>
+ Vector3<T> max(const Vector3<T>& vec1, const Vector3<T>& vec3)
+ {
+ return {std::max(vec1.x, vec2.y), std::max(vec1.y, vec2.y), std::max(vec1.z, vec2.z)};
+ }
+
+ template <typename T>
+ Vector3<T> max(const Vector3<T>& vec1, const Vector3<T>& vec2, const Vector3<T>& vec3)
+ {
+ return std::max(std::max(vec1, vec2), std::max(vec2, vec3));
+ }
+
+ template <typename T>
+ Vector4<T> max(const Vector4<T>& vec1, const Vector4<T>& vec2)
+ {
+ return {std::max(vec1.x, vec2.x), std::max(vec1.y, vec2.y), std::max(vec1.z, vec2.z), std::max(vec1.w, vec2.w)};
+ }
+
+ template <typename T>
+ Vector4<T> max(const Vector4<T>& vec1, const Vector4<T>& vec2, const Vector4<T>& vec3)
+ {
+ return std::max(std::max(vec1, vec2), std::max(vec2, vec3));
+ }
+}