4 changed files with 549 additions and 0 deletions
-
11src/common/common.vcxproj
-
1src/common/common.vcxproj.filters
-
2src/common/src/common_types.h
-
535src/common/src/swap.h
@ -0,0 +1,535 @@ |
|||||
|
// Copyright (c) 2012- PPSSPP Project / Dolphin Project. |
||||
|
|
||||
|
// This program is free software: you can redistribute it and/or modify |
||||
|
// it under the terms of the GNU General Public License as published by |
||||
|
// the Free Software Foundation, version 2.0 or later versions. |
||||
|
|
||||
|
// This program is distributed in the hope that it will be useful, |
||||
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
||||
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
||||
|
// GNU General Public License 2.0 for more details. |
||||
|
|
||||
|
// A copy of the GPL 2.0 should have been included with the program. |
||||
|
// If not, see http://www.gnu.org/licenses/ |
||||
|
|
||||
|
// Official git repository and contact information can be found at |
||||
|
// https://github.com/hrydgard/ppsspp and http://www.ppsspp.org/. |
||||
|
|
||||
|
#pragma once |
||||
|
|
||||
|
// Android |
||||
|
#if defined(ANDROID) |
||||
|
#include <sys/endian.h> |
||||
|
|
||||
|
#if _BYTE_ORDER == _LITTLE_ENDIAN && !defined(COMMON_LITTLE_ENDIAN) |
||||
|
#define COMMON_LITTLE_ENDIAN 1 |
||||
|
#elif _BYTE_ORDER == _BIG_ENDIAN && !defined(COMMON_BIG_ENDIAN) |
||||
|
#define COMMON_BIG_ENDIAN 1 |
||||
|
#endif |
||||
|
|
||||
|
// GCC 4.6+ |
||||
|
#elif __GNUC__ >= 5 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 6) |
||||
|
|
||||
|
#if __BYTE_ORDER__ && (__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) && !defined(COMMON_LITTLE_ENDIAN) |
||||
|
#define COMMON_LITTLE_ENDIAN 1 |
||||
|
#elif __BYTE_ORDER__ && (__BYTE_ORDER__ == __ORDER_BIG_ENDIAN__) && !defined(COMMON_BIG_ENDIAN) |
||||
|
#define COMMON_BIG_ENDIAN 1 |
||||
|
#endif |
||||
|
|
||||
|
// LLVM/clang |
||||
|
#elif __clang__ |
||||
|
|
||||
|
#if __LITTLE_ENDIAN__ && !defined(COMMON_LITTLE_ENDIAN) |
||||
|
#define COMMON_LITTLE_ENDIAN 1 |
||||
|
#elif __BIG_ENDIAN__ && !defined(COMMON_BIG_ENDIAN) |
||||
|
#define COMMON_BIG_ENDIAN 1 |
||||
|
#endif |
||||
|
|
||||
|
// MSVC |
||||
|
#elif defined(_MSC_VER) && !defined(COMMON_BIG_ENDIAN) && !defined(COMMON_LITTLE_ENDIAN) |
||||
|
|
||||
|
#ifdef _XBOX |
||||
|
#define COMMON_BIG_ENDIAN 1 |
||||
|
#else |
||||
|
#define COMMON_LITTLE_ENDIAN 1 |
||||
|
#endif |
||||
|
|
||||
|
#endif |
||||
|
|
||||
|
// Worst case, default to little endian. |
||||
|
#if !COMMON_BIG_ENDIAN && !COMMON_LITTLE_ENDIAN |
||||
|
#define COMMON_LITTLE_ENDIAN 1 |
||||
|
#endif |
||||
|
|
||||
|
template <typename T, typename F> |
||||
|
struct swap_struct_t { |
||||
|
typedef swap_struct_t<T, F> swapped_t; |
||||
|
|
||||
|
protected: |
||||
|
T value; |
||||
|
|
||||
|
static T swap(T v) { |
||||
|
return F::swap(v); |
||||
|
} |
||||
|
public: |
||||
|
T const swap() const { |
||||
|
return swap(value); |
||||
|
|
||||
|
} |
||||
|
swap_struct_t() : value((T)0) {} |
||||
|
swap_struct_t(const T &v): value(swap(v)) {} |
||||
|
|
||||
|
template <typename S> |
||||
|
swapped_t& operator=(const S &source) { |
||||
|
value = swap((T)source); |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
operator long() const { return (long)swap(); } |
||||
|
operator s8() const { return (s8)swap(); } |
||||
|
operator u8() const { return (u8)swap(); } |
||||
|
operator s16() const { return (s16)swap(); } |
||||
|
operator u16() const { return (u16)swap(); } |
||||
|
operator s32() const { return (s32)swap(); } |
||||
|
operator u32() const { return (u32)swap(); } |
||||
|
operator s64() const { return (s64)swap(); } |
||||
|
operator u64() const { return (u64)swap(); } |
||||
|
operator float() const { return (float)swap(); } |
||||
|
operator double() const { return (double)swap(); } |
||||
|
|
||||
|
// +v |
||||
|
swapped_t operator +() const { |
||||
|
return +swap(); |
||||
|
} |
||||
|
// -v |
||||
|
swapped_t operator -() const { |
||||
|
return -swap(); |
||||
|
} |
||||
|
|
||||
|
// v / 5 |
||||
|
swapped_t operator/(const swapped_t &i) const { |
||||
|
return swap() / i.swap(); |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t operator/(const S &i) const { |
||||
|
return swap() / i; |
||||
|
} |
||||
|
|
||||
|
// v * 5 |
||||
|
swapped_t operator*(const swapped_t &i) const { |
||||
|
return swap() * i.swap(); |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t operator*(const S &i) const { |
||||
|
return swap() * i; |
||||
|
} |
||||
|
|
||||
|
// v + 5 |
||||
|
swapped_t operator+(const swapped_t &i) const { |
||||
|
return swap() + i.swap(); |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t operator+(const S &i) const { |
||||
|
return swap() + (T)i; |
||||
|
} |
||||
|
// v - 5 |
||||
|
swapped_t operator-(const swapped_t &i) const { |
||||
|
return swap() - i.swap(); |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t operator-(const S &i) const { |
||||
|
return swap() - (T)i; |
||||
|
} |
||||
|
|
||||
|
// v += 5 |
||||
|
swapped_t& operator+=(const swapped_t &i) { |
||||
|
value = swap(swap() + i.swap()); |
||||
|
return *this; |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t& operator+=(const S &i) { |
||||
|
value = swap(swap() + (T)i); |
||||
|
return *this; |
||||
|
} |
||||
|
// v -= 5 |
||||
|
swapped_t& operator-=(const swapped_t &i) { |
||||
|
value = swap(swap() - i.swap()); |
||||
|
return *this; |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t& operator-=(const S &i) { |
||||
|
value = swap(swap() - (T)i); |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
// ++v |
||||
|
swapped_t& operator++() { |
||||
|
value = swap(swap()+1); |
||||
|
return *this; |
||||
|
} |
||||
|
// --v |
||||
|
swapped_t& operator--() { |
||||
|
value = swap(swap()-1); |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
// v++ |
||||
|
swapped_t operator++(int) { |
||||
|
swapped_t old = *this; |
||||
|
value = swap(swap()+1); |
||||
|
return old; |
||||
|
} |
||||
|
// v-- |
||||
|
swapped_t operator--(int) { |
||||
|
swapped_t old = *this; |
||||
|
value = swap(swap()-1); |
||||
|
return old; |
||||
|
} |
||||
|
// Comparaison |
||||
|
// v == i |
||||
|
bool operator==(const swapped_t &i) const { |
||||
|
return swap() == i.swap(); |
||||
|
} |
||||
|
template <typename S> |
||||
|
bool operator==(const S &i) const { |
||||
|
return swap() == i; |
||||
|
} |
||||
|
|
||||
|
// v != i |
||||
|
bool operator!=(const swapped_t &i) const { |
||||
|
return swap() != i.swap(); |
||||
|
} |
||||
|
template <typename S> |
||||
|
bool operator!=(const S &i) const { |
||||
|
return swap() != i; |
||||
|
} |
||||
|
|
||||
|
// v > i |
||||
|
bool operator>(const swapped_t &i) const { |
||||
|
return swap() > i.swap(); |
||||
|
} |
||||
|
template <typename S> |
||||
|
bool operator>(const S &i) const { |
||||
|
return swap() > i; |
||||
|
} |
||||
|
|
||||
|
// v < i |
||||
|
bool operator<(const swapped_t &i) const { |
||||
|
return swap() < i.swap(); |
||||
|
} |
||||
|
template <typename S> |
||||
|
bool operator<(const S &i) const { |
||||
|
return swap() < i; |
||||
|
} |
||||
|
|
||||
|
// v >= i |
||||
|
bool operator>=(const swapped_t &i) const { |
||||
|
return swap() >= i.swap(); |
||||
|
} |
||||
|
template <typename S> |
||||
|
bool operator>=(const S &i) const { |
||||
|
return swap() >= i; |
||||
|
} |
||||
|
|
||||
|
// v <= i |
||||
|
bool operator<=(const swapped_t &i) const { |
||||
|
return swap() <= i.swap(); |
||||
|
} |
||||
|
template <typename S> |
||||
|
bool operator<=(const S &i) const { |
||||
|
return swap() <= i; |
||||
|
} |
||||
|
|
||||
|
// logical |
||||
|
swapped_t operator !() const { |
||||
|
return !swap(); |
||||
|
} |
||||
|
|
||||
|
// bitmath |
||||
|
swapped_t operator ~() const { |
||||
|
return ~swap(); |
||||
|
} |
||||
|
|
||||
|
swapped_t operator &(const swapped_t &b) const { |
||||
|
return swap() & b.swap(); |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t operator &(const S &b) const { |
||||
|
return swap() & b; |
||||
|
} |
||||
|
swapped_t& operator &=(const swapped_t &b) { |
||||
|
value = swap(swap() & b.swap()); |
||||
|
return *this; |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t& operator &=(const S b) { |
||||
|
value = swap(swap() & b); |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
swapped_t operator |(const swapped_t &b) const { |
||||
|
return swap() | b.swap(); |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t operator |(const S &b) const { |
||||
|
return swap() | b; |
||||
|
} |
||||
|
swapped_t& operator |=(const swapped_t &b) { |
||||
|
value = swap(swap() | b.swap()); |
||||
|
return *this; |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t& operator |=(const S &b) { |
||||
|
value = swap(swap() | b); |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
swapped_t operator ^(const swapped_t &b) const { |
||||
|
return swap() ^ b.swap(); |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t operator ^(const S &b) const { |
||||
|
return swap() ^ b; |
||||
|
} |
||||
|
swapped_t& operator ^=(const swapped_t &b) { |
||||
|
value = swap(swap() ^ b.swap()); |
||||
|
return *this; |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t& operator ^=(const S &b) { |
||||
|
value = swap(swap() ^ b); |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
template <typename S> |
||||
|
swapped_t operator <<(const S &b) const { |
||||
|
return swap() << b; |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t& operator <<=(const S &b) const { |
||||
|
value = swap(swap() << b); |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
template <typename S> |
||||
|
swapped_t operator >>(const S &b) const { |
||||
|
return swap() >> b; |
||||
|
} |
||||
|
template <typename S> |
||||
|
swapped_t& operator >>=(const S &b) const { |
||||
|
value = swap(swap() >> b); |
||||
|
return *this; |
||||
|
} |
||||
|
|
||||
|
// Member |
||||
|
/** todo **/ |
||||
|
|
||||
|
|
||||
|
// Arithmetics |
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend S operator+(const S &p, const swapped_t v); |
||||
|
|
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend S operator-(const S &p, const swapped_t v); |
||||
|
|
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend S operator/(const S &p, const swapped_t v); |
||||
|
|
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend S operator*(const S &p, const swapped_t v); |
||||
|
|
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend S operator%(const S &p, const swapped_t v); |
||||
|
|
||||
|
// Arithmetics + assignements |
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend S operator+=(const S &p, const swapped_t v); |
||||
|
|
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend S operator-=(const S &p, const swapped_t v); |
||||
|
|
||||
|
// Bitmath |
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend S operator&(const S &p, const swapped_t v); |
||||
|
|
||||
|
// Comparison |
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend bool operator<(const S &p, const swapped_t v); |
||||
|
|
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend bool operator>(const S &p, const swapped_t v); |
||||
|
|
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend bool operator<=(const S &p, const swapped_t v); |
||||
|
|
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend bool operator>=(const S &p, const swapped_t v); |
||||
|
|
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend bool operator!=(const S &p, const swapped_t v); |
||||
|
|
||||
|
template <typename S, typename T2, typename F2> |
||||
|
friend bool operator==(const S &p, const swapped_t v); |
||||
|
}; |
||||
|
|
||||
|
|
||||
|
// Arithmetics |
||||
|
template <typename S, typename T, typename F> |
||||
|
S operator+(const S &i, const swap_struct_t<T, F> v) { |
||||
|
return i + v.swap(); |
||||
|
} |
||||
|
|
||||
|
template <typename S, typename T, typename F> |
||||
|
S operator-(const S &i, const swap_struct_t<T, F> v) { |
||||
|
return i - v.swap(); |
||||
|
} |
||||
|
|
||||
|
template <typename S, typename T, typename F> |
||||
|
S operator/(const S &i, const swap_struct_t<T, F> v) { |
||||
|
return i / v.swap(); |
||||
|
} |
||||
|
|
||||
|
template <typename S, typename T, typename F> |
||||
|
S operator*(const S &i, const swap_struct_t<T, F> v) { |
||||
|
return i * v.swap(); |
||||
|
} |
||||
|
|
||||
|
template <typename S, typename T, typename F> |
||||
|
S operator%(const S &i, const swap_struct_t<T, F> v) { |
||||
|
return i % v.swap(); |
||||
|
} |
||||
|
|
||||
|
// Arithmetics + assignements |
||||
|
template <typename S, typename T, typename F> |
||||
|
S &operator+=(S &i, const swap_struct_t<T, F> v) { |
||||
|
i += v.swap(); |
||||
|
return i; |
||||
|
} |
||||
|
|
||||
|
template <typename S, typename T, typename F> |
||||
|
S &operator-=(S &i, const swap_struct_t<T, F> v) { |
||||
|
i -= v.swap(); |
||||
|
return i; |
||||
|
} |
||||
|
|
||||
|
// Logical |
||||
|
template <typename S, typename T, typename F> |
||||
|
S operator&(const S &i, const swap_struct_t<T, F> v) { |
||||
|
return i & v.swap(); |
||||
|
} |
||||
|
|
||||
|
template <typename S, typename T, typename F> |
||||
|
S operator&(const swap_struct_t<T, F> v, const S &i) { |
||||
|
return (S)(v.swap() & i); |
||||
|
} |
||||
|
|
||||
|
|
||||
|
// Comparaison |
||||
|
template <typename S, typename T, typename F> |
||||
|
bool operator<(const S &p, const swap_struct_t<T, F> v) { |
||||
|
return p < v.swap(); |
||||
|
} |
||||
|
template <typename S, typename T, typename F> |
||||
|
bool operator>(const S &p, const swap_struct_t<T, F> v) { |
||||
|
return p > v.swap(); |
||||
|
} |
||||
|
template <typename S, typename T, typename F> |
||||
|
bool operator<=(const S &p, const swap_struct_t<T, F> v) { |
||||
|
return p <= v.swap(); |
||||
|
} |
||||
|
template <typename S, typename T, typename F> |
||||
|
bool operator>=(const S &p, const swap_struct_t<T, F> v) { |
||||
|
return p >= v.swap(); |
||||
|
} |
||||
|
template <typename S, typename T, typename F> |
||||
|
bool operator!=(const S &p, const swap_struct_t<T, F> v) { |
||||
|
return p != v.swap(); |
||||
|
} |
||||
|
template <typename S, typename T, typename F> |
||||
|
bool operator==(const S &p, const swap_struct_t<T, F> v) { |
||||
|
return p == v.swap(); |
||||
|
} |
||||
|
|
||||
|
template <typename T> |
||||
|
struct swap_64_t { |
||||
|
static T swap(T x) { |
||||
|
return (T)bswap64(*(u64 *)&x); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
template <typename T> |
||||
|
struct swap_32_t { |
||||
|
static T swap(T x) { |
||||
|
return (T)bswap32(*(u32 *)&x); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
template <typename T> |
||||
|
struct swap_16_t { |
||||
|
static T swap(T x) { |
||||
|
return (T)bswap16(*(u16 *)&x); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
template <typename T> |
||||
|
struct swap_float_t { |
||||
|
static T swap(T x) { |
||||
|
return (T)bswapf(*(float *)&x); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
template <typename T> |
||||
|
struct swap_double_t { |
||||
|
static T swap(T x) { |
||||
|
return (T)bswapd(*(double *)&x); |
||||
|
} |
||||
|
}; |
||||
|
|
||||
|
#if COMMON_LITTLE_ENDIAN |
||||
|
typedef u32 u32_le; |
||||
|
typedef u16 u16_le; |
||||
|
typedef u64 u64_le; |
||||
|
|
||||
|
typedef s32 s32_le; |
||||
|
typedef s16 s16_le; |
||||
|
typedef s64 s64_le; |
||||
|
|
||||
|
typedef float float_le; |
||||
|
typedef double double_le; |
||||
|
|
||||
|
typedef swap_struct_t<u64, swap_64_t<u64>> u64_be; |
||||
|
typedef swap_struct_t<s64, swap_64_t<s64>> s64_be; |
||||
|
|
||||
|
typedef swap_struct_t<u32, swap_32_t<u32>> u32_be; |
||||
|
typedef swap_struct_t<s32, swap_32_t<s32>> s32_be; |
||||
|
|
||||
|
typedef swap_struct_t<u16, swap_16_t<u16>> u16_be; |
||||
|
typedef swap_struct_t<s16, swap_16_t<s16>> s16_be; |
||||
|
|
||||
|
typedef swap_struct_t<float, swap_float_t<float> > float_be; |
||||
|
typedef swap_struct_t<double, swap_double_t<double> > double_be; |
||||
|
#else |
||||
|
|
||||
|
typedef swap_struct_t<u64, swap_64_t<u64>> u64_le; |
||||
|
typedef swap_struct_t<s64, swap_64_t<s64>> s64_le; |
||||
|
|
||||
|
typedef swap_struct_t<u32, swap_32_t<u32>> u32_le; |
||||
|
typedef swap_struct_t<s32, swap_32_t<s32>> s32_le; |
||||
|
|
||||
|
typedef swap_struct_t<u16, swap_16_t<u16>> u16_le; |
||||
|
typedef swap_struct_t<s16, swap_16_t<s16>> s16_le; |
||||
|
|
||||
|
typedef swap_struct_t<float, swap_float_t<float> > float_le; |
||||
|
typedef swap_struct_t<double, swap_double_t<double> > double_le; |
||||
|
|
||||
|
typedef u32 u32_be; |
||||
|
typedef u16 u16_be; |
||||
|
typedef u64 u64_be; |
||||
|
|
||||
|
typedef s32 s32_be; |
||||
|
typedef s16 s16_be; |
||||
|
typedef s64 s64_be; |
||||
|
|
||||
|
typedef float float_be; |
||||
|
typedef double double_be; |
||||
|
#endif |
||||
Write
Preview
Loading…
Cancel
Save
Reference in new issue