Shinya Kitaoka 810553
#pragma once
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
#ifndef TCG_SIZE_H
Toshihiro Shimizu 890ddd
#define TCG_SIZE_H
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
namespace tcg {
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//**********************************************************************************
Toshihiro Shimizu 890ddd
//    Bidimensional size  class
Toshihiro Shimizu 890ddd
//**********************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename T>
Toshihiro Shimizu 890ddd
struct SizeT {
Shinya Kitaoka 120a6e
  typedef T value_type;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  T w, h;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  SizeT() : w(), h() {}
Shinya Kitaoka 120a6e
  SizeT(T w_, T h_) : w(w_), h(h_) {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool empty() const { return (w <= 0) || (h <= 0); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  SizeT &operator+=(const SizeT &other) {
Shinya Kitaoka 120a6e
    w += other.w, h += other.h;
Shinya Kitaoka 120a6e
    return *this;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  SizeT &operator-=(const SizeT &other) {
Shinya Kitaoka 120a6e
    w -= other.w, h -= other.h;
Shinya Kitaoka 120a6e
    return *this;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  friend SizeT<T> operator+(const SizeT<T> &a, const SizeT<T> &b) {
Shinya Kitaoka 120a6e
    return SizeT<T>(a.w + b.w, a.h + b.h);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  friend SizeT<T> operator-(const SizeT<T> &a, const SizeT<T> &b) {
Shinya Kitaoka 120a6e
    return SizeT<T>(a.w - b.w, a.h - b.h);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  template <typename K>
Shinya Kitaoka 120a6e
  SizeT &operator*=(K k) {
Shinya Kitaoka 120a6e
    w *= k, h *= k;
Shinya Kitaoka 120a6e
    return *this;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  template <typename K>
Shinya Kitaoka 120a6e
  SizeT &operator/=(K k) {
Shinya Kitaoka 120a6e
    w /= k, h /= k;
Shinya Kitaoka 120a6e
    return *this;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  template <typename K>
Shinya Kitaoka 120a6e
  friend SizeT<T> operator*(K k, const SizeT<T> &a) {
Shinya Kitaoka 120a6e
    return SizeT<T>(k * a.w, k * a.h);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  template <typename K>
Shinya Kitaoka 120a6e
  friend SizeT<T> operator*(const SizeT<T> &a, K k) {
Shinya Kitaoka 120a6e
    return SizeT<T>(a.w * k, a.h * k);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  template <typename K>
Shinya Kitaoka 120a6e
  friend SizeT<T> operator/(const SizeT<T> &a, K k) {
Shinya Kitaoka 120a6e
    return SizeT<T>(a.w / k, a.h / k);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  SizeT &operator&=(const SizeT &other) {
Shinya Kitaoka 120a6e
    if (other.w < w) w = other.w;
Shinya Kitaoka 120a6e
    if (other.h < h) h = other.h;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    return *this;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  SizeT &operator|=(const SizeT &other) {
Shinya Kitaoka 120a6e
    if (other.w > w) w = other.w;
Shinya Kitaoka 120a6e
    if (other.h > h) h = other.h;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    return *this;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  friend SizeT<T> operator&(const SizeT<T> &a, const SizeT<T> &b) {
Shinya Kitaoka 120a6e
    SizeT<T> tmp(a);
Shinya Kitaoka 120a6e
    return tmp &= b;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  friend SizeT<T> operator|(const SizeT<T> &a, const SizeT<T> &b) {
Shinya Kitaoka 120a6e
    SizeT<T> tmp(a);
Shinya Kitaoka 120a6e
    return tmp |= b;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef SizeT<int> SizeI;
Toshihiro Shimizu 890ddd
typedef SizeI Size;
Toshihiro Shimizu 890ddd
typedef SizeT<double> SizeD;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//**********************************************************************************
Toshihiro Shimizu 890ddd
//    Tridimensional size  class
Toshihiro Shimizu 890ddd
//**********************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <typename T>
Toshihiro Shimizu 890ddd
struct Size3T {
Shinya Kitaoka 120a6e
  typedef T value_type;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  T w, h, d;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  Size3T() : w(), h(), d() {}
Shinya Kitaoka 120a6e
  Size3T(T w_, T h_, T d_) : w(w_), h(h_), d(d_) {}
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  bool empty() const { return (w <= 0) || (h <= 0) || (d <= 0); }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  Size3T &operator+=(const Size3T &other) {
Shinya Kitaoka 120a6e
    w += other.w, h += other.h, d += other.d;
Shinya Kitaoka 120a6e
    return *this;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  Size3T &operator-=(const Size3T &other) {
Shinya Kitaoka 120a6e
    w -= other.w, h -= other.h, d -= other.d;
Shinya Kitaoka 120a6e
    return *this;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  friend Size3T<T> operator+(const Size3T<T> &a, const Size3T<T> &b) {
Shinya Kitaoka 120a6e
    return SizeT<T>(a.w + b.w, a.h + b.h, a.d + b.d);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  friend Size3T<T> operator-(const Size3T<T> &a, const Size3T<T> &b) {
Shinya Kitaoka 120a6e
    return SizeT<T>(a.w - b.w, a.h - b.h, a.d + b.d);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  template <typename K>
Shinya Kitaoka 120a6e
  Size3T &operator*=(K k) {
Shinya Kitaoka 120a6e
    w *= k, h *= k, d *= k;
Shinya Kitaoka 120a6e
    return *this;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  template <typename K>
Shinya Kitaoka 120a6e
  Size3T &operator/=(K k) {
Shinya Kitaoka 120a6e
    w /= k, h /= k, d /= k;
Shinya Kitaoka 120a6e
    return *this;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  template <typename K>
Shinya Kitaoka 120a6e
  friend Size3T<T> operator*(K k, const Size3T<T> &a) {
Shinya Kitaoka 120a6e
    return Size3T<T>(k * a.w, k * a.h, k * a.d);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  template <typename K>
Shinya Kitaoka 120a6e
  friend Size3T<T> operator*(const Size3T<T> &a, K k) {
Shinya Kitaoka 120a6e
    return Size3T<T>(a.w * k, a.h * k, a.d * k);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  template <typename K>
Shinya Kitaoka 120a6e
  friend Size3T<T> operator/(const Size3T<T> &a, K k) {
Shinya Kitaoka 120a6e
    return Size3T<T>(a.w / k, a.h / k, a.d / k);
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  Size3T &operator&=(const Size3T &other) {
Shinya Kitaoka 120a6e
    if (other.w < w) w = other.w;
Shinya Kitaoka 120a6e
    if (other.h < h) h = other.h;
Shinya Kitaoka 120a6e
    if (other.d < d) d = other.d;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    return *this;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  Size3T &operator|=(const Size3T &other) {
Shinya Kitaoka 120a6e
    if (other.w > w) w = other.w;
Shinya Kitaoka 120a6e
    if (other.h > h) h = other.h;
Shinya Kitaoka 120a6e
    if (other.d > d) d = other.d;
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
    return *this;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
Shinya Kitaoka 120a6e
  friend Size3T<T> operator&(const Size3T<T> &a, const Size3T<T> &b) {
Shinya Kitaoka 120a6e
    Size3T<T> tmp(a);
Shinya Kitaoka 120a6e
    return tmp &= b;
Shinya Kitaoka 120a6e
  }
Shinya Kitaoka 120a6e
  friend Size3T<T> operator|(const Size3T<T> &a, const Size3T<T> &b) {
Shinya Kitaoka 120a6e
    Size3T<T> tmp(a);
Shinya Kitaoka 120a6e
    return tmp |= b;
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//------------------------------------------------------------------------
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
typedef Size3T<int> Size3I;
Toshihiro Shimizu 890ddd
typedef Size3I Size3;
Toshihiro Shimizu 890ddd
typedef Size3T<double> Size3D;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
//**********************************************************************************
Toshihiro Shimizu 890ddd
//    N-dimensional size  class
Toshihiro Shimizu 890ddd
//**********************************************************************************
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
template <int N, typename T>
Toshihiro Shimizu 890ddd
struct SizeN {
Shinya Kitaoka 120a6e
  static const int size = N;
Shinya Kitaoka 120a6e
  typedef T value_type;
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  T span[N];
Toshihiro Shimizu 890ddd
Toshihiro Shimizu 890ddd
public:
Shinya Kitaoka 120a6e
  SizeN() {}
Shinya Kitaoka 120a6e
  SizeN(const T &t) { std::fill(span, span + N, t); }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  template <typename It>
Shinya Kitaoka 120a6e
  SizeN(It begin, It end) {
Shinya Kitaoka 120a6e
    std::copy(begin, end, span);
Shinya Kitaoka 120a6e
  }
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
  // To be completed...
Toshihiro Shimizu 890ddd
};
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
}  // namespace tcg
Toshihiro Shimizu 890ddd
Shinya Kitaoka 120a6e
#endif  // TCG_SIZE_H