diff mupdf-source/thirdparty/zxing-cpp/core/src/Flags.h @ 2:b50eed0cc0ef upstream

ADD: MuPDF v1.26.7: the MuPDF source as downloaded by a default build of PyMuPDF 1.26.4. The directory name has changed: no version number in the expanded directory now.
author Franz Glasner <fzglas.hg@dom66.de>
date Mon, 15 Sep 2025 11:43:07 +0200
parents
children
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/mupdf-source/thirdparty/zxing-cpp/core/src/Flags.h	Mon Sep 15 11:43:07 2025 +0200
@@ -0,0 +1,120 @@
+/*
+* Copyright 2020 Axel Waggershauser
+*/
+// SPDX-License-Identifier: Apache-2.0
+
+#pragma once
+
+#include "BitHacks.h"
+
+#include <cstddef>
+#include <iterator>
+#include <type_traits>
+
+namespace ZXing {
+
+template<typename Enum>
+class Flags
+{
+	static_assert(std::is_enum<Enum>::value, "Flags is only usable on enumeration types.");
+
+	using Int = typename std::underlying_type<Enum>::type;
+	Int i = 0;
+
+	constexpr inline Flags(Int other) : i(other) {}
+	constexpr static inline unsigned highestBitSet(Int x) noexcept { return x < 2 ? x : 1 + highestBitSet(x >> 1); }
+
+public:
+	using enum_type = Enum;
+
+	constexpr inline Flags() noexcept = default;
+	constexpr inline Flags(Enum flag) noexcept : i(Int(flag)) {}
+
+//	constexpr inline Flags(std::initializer_list<Enum> flags) noexcept
+//		: i(initializer_list_helper(flags.begin(), flags.end()))
+//	{}
+
+	class iterator
+	{
+		friend class Flags;
+		const Int _flags = 0;
+		int _pos = 0;
+		iterator(Int i, int p) : _flags(i), _pos(p) {}
+	public:
+		using iterator_category = std::input_iterator_tag;
+		using value_type = Enum;
+		using difference_type = std::ptrdiff_t;
+		using pointer = Enum*;
+		using reference = Enum&;
+
+		Enum operator*() const noexcept { return Enum(1 << _pos); }
+
+		iterator& operator++() noexcept
+		{
+			while (++_pos < BitHacks::HighestBitSet(_flags) && !((1 << _pos) & _flags))
+				;
+			return *this;
+		}
+
+		bool operator==(const iterator& rhs) const noexcept { return _pos == rhs._pos; }
+		bool operator!=(const iterator& rhs) const noexcept { return !(*this == rhs); }
+	};
+
+	iterator begin() const noexcept { return {i, BitHacks::NumberOfTrailingZeros(i)}; }
+	iterator end() const noexcept { return {i, BitHacks::HighestBitSet(i) + 1}; }
+
+	bool empty() const noexcept { return i == 0; }
+	int count() const noexcept { return BitHacks::CountBitsSet(i); }
+
+	constexpr inline bool operator==(Flags other) const noexcept { return i == other.i; }
+
+	inline Flags& operator&=(Flags mask) noexcept { return i &= mask.i, *this; }
+	inline Flags& operator&=(Enum mask) noexcept { return i &= Int(mask), *this; }
+	inline Flags& operator|=(Flags other) noexcept { return i |= other.i, *this; }
+	inline Flags& operator|=(Enum other) noexcept { return i |= Int(other), *this; }
+//	inline Flags &operator^=(Flags other) noexcept { return i ^= other.i, *this; }
+//	inline Flags &operator^=(Enum other) noexcept { return i ^= Int(other), *this; }
+
+	constexpr inline Flags operator&(Flags other) const noexcept { return i & other.i; }
+	constexpr inline Flags operator&(Enum other) const noexcept { return i & Int(other); }
+	constexpr inline Flags operator|(Flags other) const noexcept { return i | other.i; }
+	constexpr inline Flags operator|(Enum other) const noexcept { return i | Int(other); }
+//	constexpr inline Flags operator^(Flags other) const noexcept { return i ^ other.i; }
+//	constexpr inline Flags operator^(Enum other) const noexcept { return i ^ Int(other); }
+//	constexpr inline Flags operator~() const noexcept { return ~i; }
+
+//	constexpr inline operator Int() const noexcept { return i; }
+//	constexpr inline bool operator!() const noexcept { return !i; }
+//	constexpr inline Int asInt() const noexcept { return i; }
+
+	constexpr inline bool testFlag(Enum flag) const noexcept
+	{
+		return (i & Int(flag)) == Int(flag) && (Int(flag) != 0 || i == Int(flag));
+	}
+	constexpr inline bool testFlags(Flags mask) const noexcept { return i & mask.i; }
+	inline Flags& setFlag(Enum flag, bool on = true) noexcept
+	{
+		return on ? (*this |= flag) : (*this &= ~Int(flag));
+	}
+	inline void clear() noexcept { i = 0; }
+
+	constexpr static Flags all() noexcept { return ~(unsigned(~0) << highestBitSet(Int(Enum::_max))); }
+
+private:
+//	constexpr static inline Int
+//	initializer_list_helper(typename std::initializer_list<Enum>::const_iterator it,
+//							typename std::initializer_list<Enum>::const_iterator end) noexcept
+//	{
+//		return (it == end ? Int(0) : (Int(*it) | initializer_list_helper(it + 1, end)));
+//	}
+};
+
+#define ZX_DECLARE_FLAGS(FLAGS, ENUM) \
+	using FLAGS = Flags<ENUM>; \
+	constexpr inline FLAGS operator|(FLAGS::enum_type e1, FLAGS::enum_type e2) noexcept { return FLAGS(e1) | e2; } \
+	constexpr inline FLAGS operator|(FLAGS::enum_type e, FLAGS f) noexcept { return f | e; } \
+	constexpr inline bool operator==(FLAGS::enum_type e, FLAGS f) noexcept { return FLAGS(e) == f; } \
+	constexpr inline bool operator==(FLAGS f, FLAGS::enum_type e) noexcept { return FLAGS(e) == f; }
+
+} // ZXing
+