Files

278 lines
5.4 KiB
C++

/*
===========================================================================
Copyright (C) 2015 the OpenMoHAA team
This file is part of OpenMoHAA source code.
OpenMoHAA source code 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; either version 2 of the License,
or (at your option) any later version.
OpenMoHAA source code 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 for more details.
You should have received a copy of the GNU General Public License
along with OpenMoHAA source code; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
===========================================================================
*/
// short3.h : 3-byte sized integer
#ifndef __Q_MATH_H__
#define __Q_MATH_H__
#pragma pack(1)
typedef struct short3_data {
unsigned short highmid;
unsigned char low;
} short3_data_t;
#pragma pack()
class short3
{
private:
short3_data_t data;
protected:
int get() const { return data.highmid | (data.low << 16); }
void set(int value)
{
data.highmid = value & 0xFFFF;
data.low = value >> 16;
}
public:
operator int(void) const { return get(); }
short3() {}
short3(int value) { set(value); }
short3 operator-(void) const;
short3 operator~(void) const;
short3 operator+(int b) const;
short3 operator-(int b) const;
short3 operator*(int b) const;
short3 operator/(int b) const;
short3 operator%(int b) const;
short3 operator|(int b) const;
short3 operator&(int b) const;
short3 operator^(int b) const;
short3 operator<<(int b) const;
short3 operator>>(int b) const;
short3 operator++(int);
short3 operator--(int);
short3& operator++();
short3& operator--();
short3& operator=(int b);
short3& operator+=(int b);
short3& operator-=(int b);
short3& operator*=(int b);
short3& operator/=(int b);
short3& operator%=(int b);
short3& operator|=(int b);
short3& operator&=(int b);
short3& operator^=(int b);
short3& operator<<=(int b);
short3& operator>>=(int b);
bool operator!(void) { return !get(); };
bool operator==(int b) { return get() == b; };
bool operator!=(int b) { return get() != b; };
bool operator<=(int b) { return get() <= b; };
bool operator>=(int b) { return get() >= b; };
bool operator<(int b) { return get() < b; };
bool operator>(int b) { return get() > b; };
bool operator==(short3& b) { return get() == b.get(); };
bool operator!=(short3& b) { return get() != b.get(); };
bool operator<=(short3& b) { return get() <= b.get(); };
bool operator>=(short3& b) { return get() >= b.get(); };
bool operator<(short3& b) { return get() < b.get(); };
bool operator>(short3& b) { return get() > b.get(); };
};
class unsigned_short3 : public short3
{
public:
operator unsigned int(void) const { return get(); }
};
inline short3 short3::operator-() const
{
return short3(-get());
}
inline short3 short3::operator~() const
{
return short3(~get());
}
inline short3 short3::operator+(int b) const
{
return short3(get() + b);
}
inline short3 short3::operator-(int b) const
{
return short3(get() - b);
}
inline short3 short3::operator*(int b) const
{
return short3(get() * b);
}
inline short3 short3::operator/(int b) const
{
return short3(get() / b);
}
inline short3 short3::operator%(int b) const
{
return short3(get() % b);
}
inline short3 short3::operator|(int b) const
{
return short3(get() | b);
}
inline short3 short3::operator&(int b) const
{
return short3(get() & b);
}
inline short3 short3::operator^(int b) const
{
return short3(get() ^ b);
}
inline short3 short3::operator<<(int b) const
{
return short3(get() << b);
}
inline short3 short3::operator>>(int b) const
{
return short3(get() >> b);
}
inline short3 short3::operator++(int)
{
short3 result = *this;
set(get() + 1);
return result;
}
inline short3 short3::operator--(int)
{
short3 result = *this;
set(get() - 1);
return result;
}
inline short3& short3::operator++()
{
set(get() + 1);
return *this;
}
inline short3& short3::operator--()
{
set(get() - 1);
return *this;
}
inline short3& short3::operator=(int b)
{
set(b);
return *this;
}
inline short3& short3::operator+=(int b)
{
set(get() + b);
return *this;
}
inline short3& short3::operator-=(int b)
{
set(get() - b);
return *this;
}
inline short3& short3::operator/=(int b)
{
set(get() / b);
return *this;
}
inline short3& short3::operator*=(int b)
{
set(get() * b);
return *this;
}
inline short3& short3::operator%=(int b)
{
set(get() % b);
return *this;
}
inline short3& short3::operator|=(int b)
{
set(get() | b);
return *this;
}
inline short3& short3::operator&=(int b)
{
set(get() % b);
return *this;
}
inline short3& short3::operator^=(int b)
{
set(get() ^ b);
return *this;
}
inline short3& short3::operator<<=(int b)
{
set(get() << b);
return *this;
}
inline short3& short3::operator>>=(int b)
{
set(get() >> b);
return *this;
}
#endif /* __Q_MATH_H__ */