# HG changeset patch # User David Demelier # Date 1446668490 -3600 # Node ID becd06089e8f5513f22bee7e11ddf1b7a5606d10 # Parent 41766abe942e8e22e94443aa579501127cc059cb Get rid of Flags, update README diff -r 41766abe942e -r becd06089e8f C++/modules/Flags/Flags.h --- a/C++/modules/Flags/Flags.h Wed Nov 04 20:53:36 2015 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,341 +0,0 @@ -/* - * Flags.h -- safe wrapper for enum flags - * - * Copyright (c) 2013-2015 David Demelier - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#ifndef _FLAGS_H_ -#define _FLAGS_H_ - -/** - * @file Flags.h - * @brief Provide template class Flags and operators for enum classes - */ - -#include - -/** - * @class Flags - * @brief Wrapper that store enum flags - * - * This class is used to store an enum and make bitwise operations on it. User do not need - * to supply these operators because they are implemented in the class. - * - * This class is very cheap and store the real underlying type from the enum and all functions - * are inlined. - */ -template > -class Flags final { -private: - Type m_value { 0 }; - -public: - /** - * Construct flags to 0. - */ - constexpr Flags() noexcept = default; - - /** - * Construct flags with the enum value. - * - * @param m the mask - */ - constexpr Flags(Enum m) noexcept - : m_value(static_cast(m)) - { - } - - /** - * Construct flags with the enum value. - * - * @param m the mask - */ - constexpr Flags(Type m) noexcept - : m_value(m) - { - } - - /** - * Move constructor. - * - * @param other the other - */ - inline Flags(Flags &&other) noexcept = default; - - /** - * Copy constructor. - * - * @param other the other - */ - inline Flags(const Flags &other) noexcept = default; - - /** - * Move operator. - * - * @param other the other - */ - inline Flags &operator=(Flags &&other) noexcept = default; - - /** - * Copy operator. - * - * @param other the other - */ - inline Flags &operator=(const Flags &other) noexcept = default; - - /** - * &= operator. - * - * @param m the mask - * @return *this - */ - inline Flags &operator&=(Enum m) noexcept - { - m_value &= static_cast(m); - - return *this; - } - - /** - * &= operator. - * - * @param m the mask - * @return *this - */ - inline Flags &operator&=(Type m) noexcept - { - m_value &= m; - - return *this; - } - - /** - * |= operator. - * - * @param m the mask - * @return *this - */ - inline Flags &operator|=(Enum m) noexcept - { - m_value |= static_cast(m); - - return *this; - } - - /** - * |= operator. - * - * @param m the mask - * @return *this - */ - inline Flags &operator|=(Type m) noexcept - { - m_value |= m; - - return *this; - } - - /** - * ^= operator. - * - * @param m the mask - * @return *this - */ - inline Flags &operator^=(Enum m) noexcept - { - m_value ^= static_cast(m); - - return *this; - } - - /** - * ^= operator. - * - * @param m the mask - * @return *this - */ - inline Flags &operator^=(Type m) noexcept - { - m_value ^= m; - - return *this; - } - - /** - * & operator. - * - * @param m the mask - * @return & combination - */ - constexpr Flags operator&(Enum m) const noexcept - { - return m_value & static_cast(m); - } - - /** - * & operator. - * - * @param m the mask - * @return & combination - */ - constexpr Flags operator&(Type m) const noexcept - { - return m_value & m; - } - - /** - * | operator. - * - * @param m the mask - * @return | combination - */ - constexpr Flags operator|(Enum m) const noexcept - { - return m_value | static_cast(m); - } - - /** - * | operator. - * - * @param m the mask - * @return | combination - */ - constexpr Flags operator|(Type m) const noexcept - { - return m_value | m; - } - - /** - * ^ operator. - * - * @param m the mask - * @return ^ combination - */ - constexpr Flags operator^(Enum m) const noexcept - { - return m_value & static_cast(m); - } - - /** - * ^ operator. - * - * @param m the mask - * @return ^ combination - */ - constexpr Flags operator^(Type m) const noexcept - { - return m_value & m; - } - - /** - * ~ unary operator. - * - * @return ~ - */ - constexpr Flags operator~() const noexcept - { - return ~m_value; - } - - /** - * Convert to bool. Simply check if value is not 0. - * - * @return true if value != 0 - */ - constexpr operator bool() const noexcept - { - return m_value != 0; - } - - /** - * Operator !. Simply check if value is 0. - * - * @return true if value == 0 - */ - constexpr bool operator!() const noexcept - { - return m_value == 0; - } - - /** - * Test comparison with other mask. - * - * @return true if this value == m - */ - constexpr bool operator==(Enum m) const noexcept - { - return m_value == static_cast(m); - } - - /** - * Test comparison with other mask. - * - * @return true if this value == m - */ - constexpr bool operator==(Type m) const noexcept - { - return m_value == m; - } -}; - -/** - * Apply & operator on the enum. - * - * @param x1 the first value - * @param x2 the second value - */ -template ::value, std::underlying_type_t>> -constexpr Value operator&(Value x1, Value x2) noexcept -{ - return static_cast(static_cast(x1) & static_cast(x2)); -} - -/** - * Apply | operator on the enum. - * - * @param x1 the first value - * @param x2 the second value - */ -template ::value, std::underlying_type_t>> -constexpr Value operator|(Value x1, Value x2) noexcept -{ - return static_cast(static_cast(x1) | static_cast(x2)); -} - -/** - * Apply ^ operator on the enum. - * - * @param x1 the first value - * @param x2 the second value - */ -template ::value, std::underlying_type_t>> -constexpr Value operator^(Value x1, Value x2) noexcept -{ - return static_cast(static_cast(x1) ^ static_cast(x2)); -} - -/** - * Apply ~ operator on the enum. - * - * @param x1 the first value - * @param x2 the second value - */ -template ::value, std::underlying_type_t>> -constexpr Value operator~(Value x) noexcept -{ - return static_cast(~static_cast(x)); -} - -#endif // !_FLAGS_H_ \ No newline at end of file diff -r 41766abe942e -r becd06089e8f C++/tests/Flags/main.cpp --- a/C++/tests/Flags/main.cpp Wed Nov 04 20:53:36 2015 +0100 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 @@ -1,298 +0,0 @@ -/* - * main.cpp -- main test file for Flags - * - * Copyright (c) 2013-2015 David Demelier - * - * Permission to use, copy, modify, and/or distribute this software for any - * purpose with or without fee is hereby granted, provided that the above - * copyright notice and this permission notice appear in all copies. - * - * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES - * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF - * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR - * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES - * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN - * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF - * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - */ - -#include - -#include - -#include - -enum Standard : uint8_t { - Fullscreen = (1 << 0), - Audio = (1 << 1) -}; - -enum class Strong : uint8_t { - NoLog = (1 << 0), - NoCheck = (1 << 1) -}; - -/* -------------------------------------------------------- - * Global operators on standard enum - * -------------------------------------------------------- */ - -TEST(OperatorsStandard, opand) -{ - Standard s(Fullscreen | Audio); - - ASSERT_EQ(Fullscreen, (s & Fullscreen)); - ASSERT_EQ(Audio, (s & Audio)); -} - -TEST(OperatorsStandard, opor) -{ - Standard s(Fullscreen); - - ASSERT_EQ(3, (s | Audio)); -} - -TEST(OperatorsStandard, opxor) -{ - Standard s(Fullscreen); - - ASSERT_EQ(3, (s ^ Audio)); -} - -TEST(OperatorsStandard, opnot) -{ - Standard s(Fullscreen); - - ASSERT_EQ(254, ~s); -} - -/* -------------------------------------------------------- - * Global operators on strong enum - * -------------------------------------------------------- */ - -TEST(OperatorsStrong, opand) -{ - Strong s(Strong::NoLog | Strong::NoCheck); - - ASSERT_EQ(Strong::NoLog, (s & Strong::NoLog)); - ASSERT_EQ(Strong::NoCheck, (s & Strong::NoCheck)); -} - -TEST(OperatorsStrong, opor) -{ - Strong s(Strong::NoLog); - - ASSERT_EQ(3, static_cast((s | Strong::NoCheck))); -} - -TEST(OperatorsStrong, opxor) -{ - Strong s(Strong::NoLog); - - ASSERT_EQ(3, static_cast((s ^ Strong::NoCheck))); -} - -TEST(OperatorsStrong, opnot) -{ - Strong s(Strong::NoLog); - - ASSERT_EQ(254, static_cast(~s)); -} - -/* -------------------------------------------------------- - * Flags with standard enums - * -------------------------------------------------------- */ - -TEST(Standard, construct) -{ - Flags s; - - ASSERT_FALSE(s); - ASSERT_TRUE(!s); - - Flags s2(Fullscreen | Audio); - - ASSERT_TRUE(s2); - ASSERT_FALSE(!s2); - ASSERT_TRUE(s2 & Fullscreen); - ASSERT_TRUE(s2 & Audio); - ASSERT_TRUE((s2 & Fullscreen) == Fullscreen); - ASSERT_TRUE((s2 & Audio) == Audio); - ASSERT_TRUE(s2 == (Audio | Fullscreen)); -} - -TEST(Standard, addByOne) -{ - Flags s; - - ASSERT_FALSE(s); - ASSERT_TRUE(!s); - ASSERT_TRUE(!(s & Fullscreen)); - ASSERT_TRUE(!(s & Audio)); - - s |= Fullscreen; - ASSERT_TRUE(s); - ASSERT_FALSE(!s); - ASSERT_TRUE(s & Fullscreen); - ASSERT_TRUE((s & Fullscreen) == Fullscreen); - ASSERT_FALSE(s & Audio); - ASSERT_FALSE((s & Audio) == Audio); - ASSERT_TRUE(s == Fullscreen); - - s |= Audio; - ASSERT_TRUE(s); - ASSERT_FALSE(!s); - ASSERT_TRUE(s & Fullscreen); - ASSERT_TRUE((s & Fullscreen) == Fullscreen); - ASSERT_TRUE(s & Audio); - ASSERT_TRUE((s & Audio) == Audio); - ASSERT_TRUE(s == (Fullscreen | Audio)); -} - -TEST(Standard, add) -{ - Flags s; - - s |= Fullscreen | Audio; - ASSERT_TRUE(s & (Fullscreen | Audio)); - ASSERT_TRUE((s & (Fullscreen | Audio)) == (Fullscreen | Audio)); -} - -TEST(Standard, removeByOne) -{ - Flags s(Fullscreen | Audio); - - s &= ~(Fullscreen); - ASSERT_TRUE(s); - ASSERT_FALSE(!s); - ASSERT_FALSE(s & Fullscreen); - ASSERT_FALSE((s & Fullscreen) == Fullscreen); - ASSERT_TRUE(s & Audio); - ASSERT_TRUE((s & Audio) == Audio); - - s &= ~(Audio); - ASSERT_FALSE(s); - ASSERT_TRUE(!s); -} - -TEST(Standard, remove) -{ - Flags s(Fullscreen | Audio); - - s &= ~(Fullscreen | Audio); - ASSERT_FALSE(s); - ASSERT_TRUE(!s); -} - -TEST(Standard, xorAdd) -{ - Flags s(Fullscreen | Audio); - - s ^= Audio; - ASSERT_TRUE(s & Fullscreen); - ASSERT_TRUE((s & Fullscreen) == Fullscreen); - ASSERT_FALSE(s & Audio); - ASSERT_FALSE((s & Audio) == Audio); -} - -/* -------------------------------------------------------- - * Flags with strong enums - * -------------------------------------------------------- */ - -TEST(Strong, construct) -{ - Flags s; - - ASSERT_FALSE(s); - ASSERT_TRUE(!s); - - Flags s2(Strong::NoLog | Strong::NoCheck); - - ASSERT_TRUE(s2); - ASSERT_FALSE(!s2); - ASSERT_TRUE(s2 & Strong::NoLog); - ASSERT_TRUE(s2 & Strong::NoCheck); - ASSERT_TRUE((s2 & Strong::NoLog) == Strong::NoLog); - ASSERT_TRUE((s2 & Strong::NoCheck) == Strong::NoCheck); - ASSERT_TRUE(s2 == (Strong::NoLog | Strong::NoCheck)); -} - -TEST(Strong, addByOne) -{ - Flags s; - - ASSERT_FALSE(s); - ASSERT_TRUE(!s); - ASSERT_TRUE(!(s & Strong::NoLog)); - ASSERT_TRUE(!(s & Strong::NoCheck)); - - s |= Strong::NoLog; - ASSERT_TRUE(s); - ASSERT_FALSE(!s); - ASSERT_TRUE(s & Strong::NoLog); - ASSERT_TRUE((s & Strong::NoLog) == Strong::NoLog); - ASSERT_FALSE(s & Strong::NoCheck); - ASSERT_FALSE((s & Strong::NoCheck) == Strong::NoCheck); - ASSERT_TRUE(s == Strong::NoLog); - - s |= Strong::NoCheck; - ASSERT_TRUE(s); - ASSERT_FALSE(!s); - ASSERT_TRUE(s & Strong::NoLog); - ASSERT_TRUE((s & Strong::NoLog) == Strong::NoLog); - ASSERT_TRUE(s & Strong::NoCheck); - ASSERT_TRUE((s & Strong::NoCheck) == Strong::NoCheck); - ASSERT_TRUE(s == (Strong::NoLog | Strong::NoCheck)); -} - -TEST(Strong, add) -{ - Flags s; - - s |= Strong::NoLog | Strong::NoCheck; - ASSERT_TRUE(s & (Strong::NoLog | Strong::NoCheck)); - ASSERT_TRUE((s & (Strong::NoLog | Strong::NoCheck)) == (Strong::NoLog | Strong::NoCheck)); -} - -TEST(Strong, removeByOne) -{ - Flags s(Strong::NoLog | Strong::NoCheck); - - s &= ~(Strong::NoLog); - ASSERT_TRUE(s); - ASSERT_FALSE(!s); - ASSERT_FALSE(s & Strong::NoLog); - ASSERT_FALSE((s & Strong::NoLog) == Strong::NoLog); - ASSERT_TRUE(s & Strong::NoCheck); - ASSERT_TRUE((s & Strong::NoCheck) == Strong::NoCheck); - - s &= ~(Strong::NoCheck); - ASSERT_FALSE(s); - ASSERT_TRUE(!s); -} - -TEST(Strong, remove) -{ - Flags s(Strong::NoLog | Strong::NoCheck); - - s &= ~(Strong::NoLog | Strong::NoCheck); - ASSERT_FALSE(s); - ASSERT_TRUE(!s); -} - -TEST(Strong, xorAdd) -{ - Flags s(Strong::NoLog | Strong::NoCheck); - - s ^= Strong::NoCheck; - ASSERT_TRUE(s & Strong::NoLog); - ASSERT_TRUE((s & Strong::NoLog) == Strong::NoLog); - ASSERT_FALSE(s & Strong::NoCheck); - ASSERT_FALSE((s & Strong::NoCheck) == Strong::NoCheck); -} - -int main(int argc, char **argv) -{ - testing::InitGoogleTest(&argc, argv); - - return RUN_ALL_TESTS(); -} \ No newline at end of file diff -r 41766abe942e -r becd06089e8f README.md --- a/README.md Wed Nov 04 20:53:36 2015 +0100 +++ b/README.md Wed Nov 04 21:21:30 2015 +0100 @@ -1,3 +1,32 @@ # Common code This repository contains common code reusable in C++. + +## Status + +The following status are defined: + +- **Frozen**, the module will not changed and only have bugfixes, +- **Stable**, the module is stable but may still change a little bit, +- **Testing**, the module is being tested and may change, +- **Experimental**, the module is new and completely experimental or unstable, +- **New**, the module is completely new. + +| Module | Status | Tests quality | +|--------------|--------------|---------------| +| Base64 | Frozen | \*\*\* | +| Converter | Experimental | no tests | +| Date | Experimental | no tests | +| Directory | Stable | \*\*\* | +| Dynlib | Frozen | \*\*\* | +| Format | New | no tests | +| Hash | Frozen | \*\*\* | +| Ini | Stable | \*\*\* | +| Js | New | \*\* | +| Json | Stable | \*\*\* | +| OptionParser | Testing | \*\*\* | +| Socket | Experimental | \* | +| Treenode | Frozen | \*\*\* | +| Unicode | Frozen | \*\*\* | +| Xdg | Frozen | \* | +| Zip | Testing | \*\* |