#ifndef _RIVE_PATH_SPACE_HPP_
#define _RIVE_PATH_SPACE_HPP_

#include "rive/rive_types.hpp"

namespace rive {
    enum class PathSpace : unsigned char {
        Neither = 0,
        Local = 1 << 1,
        World = 1 << 2,
        Difference = 1 << 3,
        Clipping = 1 << 4
    };

    inline constexpr PathSpace operator&(PathSpace lhs, PathSpace rhs) {
        return static_cast<PathSpace>(static_cast<std::underlying_type<PathSpace>::type>(lhs) &
                                      static_cast<std::underlying_type<PathSpace>::type>(rhs));
    }

    inline constexpr PathSpace operator^(PathSpace lhs, PathSpace rhs) {
        return static_cast<PathSpace>(static_cast<std::underlying_type<PathSpace>::type>(lhs) ^
                                      static_cast<std::underlying_type<PathSpace>::type>(rhs));
    }

    inline constexpr PathSpace operator|(PathSpace lhs, PathSpace rhs) {
        return static_cast<PathSpace>(static_cast<std::underlying_type<PathSpace>::type>(lhs) |
                                      static_cast<std::underlying_type<PathSpace>::type>(rhs));
    }

    inline constexpr PathSpace operator~(PathSpace rhs) {
        return static_cast<PathSpace>(~static_cast<std::underlying_type<PathSpace>::type>(rhs));
    }

    inline PathSpace& operator|=(PathSpace& lhs, PathSpace rhs) {
        lhs = static_cast<PathSpace>(static_cast<std::underlying_type<PathSpace>::type>(lhs) |
                                     static_cast<std::underlying_type<PathSpace>::type>(rhs));

        return lhs;
    }

    inline PathSpace& operator&=(PathSpace& lhs, PathSpace rhs) {
        lhs = static_cast<PathSpace>(static_cast<std::underlying_type<PathSpace>::type>(lhs) &
                                     static_cast<std::underlying_type<PathSpace>::type>(rhs));

        return lhs;
    }

    inline PathSpace& operator^=(PathSpace& lhs, PathSpace rhs) {
        lhs = static_cast<PathSpace>(static_cast<std::underlying_type<PathSpace>::type>(lhs) ^
                                     static_cast<std::underlying_type<PathSpace>::type>(rhs));

        return lhs;
    }
} // namespace rive

#endif
