point: operate on value types, not references
This commit is contained in:
parent
71d8a30769
commit
012f8107c6
24
point.cpp
24
point.cpp
@ -22,16 +22,15 @@
|
||||
#include <cmath>
|
||||
#include <cstdlib>
|
||||
|
||||
using namespace std;
|
||||
using util::point;
|
||||
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
template <size_t S, typename T>
|
||||
util::vector<S,T>
|
||||
util::point<S,T>::to (const point<S,T> &rhs) const
|
||||
util::point<S,T>::to (point<S,T> rhs) const
|
||||
{
|
||||
util::vector<S,T> out;
|
||||
|
||||
for (size_t i = 0; i < S; ++i)
|
||||
out.data[i] = rhs.data[i] - this->data[i];
|
||||
return out;
|
||||
@ -41,7 +40,7 @@ util::point<S,T>::to (const point<S,T> &rhs) const
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
util::vector<S,T>
|
||||
util::point<S,T>::from (const point<S,T> &rhs) const
|
||||
util::point<S,T>::from (point<S,T> rhs) const
|
||||
{
|
||||
util::vector<S,T> out;
|
||||
for (size_t i = 0; i < S; ++i)
|
||||
@ -53,10 +52,11 @@ util::point<S,T>::from (const point<S,T> &rhs) const
|
||||
///////////////////////////////////////////////////////////////////////////////
|
||||
template <size_t S, typename T>
|
||||
void
|
||||
util::point<S,T>::sanity (void) const {
|
||||
CHECK (std::all_of (begin (this->data),
|
||||
end (this->data),
|
||||
[] (double i) { return !std::isnan (i); }));
|
||||
util::point<S,T>::sanity (void) const
|
||||
{
|
||||
CHECK (std::all_of (this->begin (),
|
||||
this->end (),
|
||||
[] (auto i) { return !std::isnan (i); }));
|
||||
}
|
||||
|
||||
|
||||
@ -68,7 +68,7 @@ const util::point<S,T> util::point<S,T>::ORIGIN (T {0});
|
||||
//-----------------------------------------------------------------------------
|
||||
template <size_t S, typename T>
|
||||
std::ostream&
|
||||
util::operator<< (std::ostream &os, const util::point<S,T> &p) {
|
||||
util::operator<< (std::ostream &os, util::point<S,T> p) {
|
||||
os << "point" << S << "(";
|
||||
os << p.data[0];
|
||||
|
||||
@ -81,9 +81,9 @@ util::operator<< (std::ostream &os, const util::point<S,T> &p) {
|
||||
|
||||
|
||||
//-----------------------------------------------------------------------------
|
||||
#define INSTANTIATE_S_T(S,T) \
|
||||
template struct util::point<S,T>; \
|
||||
template std::ostream& util::operator<< (std::ostream &os, const util::point<S,T>&); \
|
||||
#define INSTANTIATE_S_T(S,T) \
|
||||
template struct util::point<S,T>; \
|
||||
template std::ostream& util::operator<< (std::ostream &os, util::point<S,T>); \
|
||||
|
||||
#define INSTANTIATE(T) \
|
||||
INSTANTIATE_S_T(1,T) \
|
||||
|
14
point.hpp
14
point.hpp
@ -34,12 +34,12 @@ namespace util {
|
||||
using coord::base<S,T,util::point,coord::xyzw>::base;
|
||||
|
||||
// point operators
|
||||
template <typename U> typename std::common_type<T,U>::type distance (const point<S,U> &) const;
|
||||
template <typename U> typename std::common_type<T,U>::type distance2 (const point<S,U> &) const;
|
||||
template <typename U> typename std::common_type<T,U>::type manhattan (const point<S,U> &) const;
|
||||
template <typename U> typename std::common_type<T,U>::type distance (point<S,U>) const;
|
||||
template <typename U> typename std::common_type<T,U>::type distance2 (point<S,U>) const;
|
||||
template <typename U> typename std::common_type<T,U>::type manhattan (point<S,U>) const;
|
||||
|
||||
vector<S,T> to (const point&) const;
|
||||
vector<S,T> from (const point&) const;
|
||||
vector<S,T> to (point) const;
|
||||
vector<S,T> from (point) const;
|
||||
|
||||
template <size_t D> point<D,T> homog (void) const;
|
||||
|
||||
@ -50,7 +50,7 @@ namespace util {
|
||||
|
||||
// iostream operators
|
||||
template <size_t S, typename T>
|
||||
std::ostream& operator<< (std::ostream&, const point<S,T>&);
|
||||
std::ostream& operator<< (std::ostream&, point<S,T>);
|
||||
|
||||
// Convenience typedefs
|
||||
typedef point<2,float> point2f;
|
||||
@ -69,7 +69,7 @@ namespace util {
|
||||
namespace std {
|
||||
template <size_t S, typename T>
|
||||
struct hash<util::point<S,T>> {
|
||||
size_t operator() (const util::point<S,T> &p) const {
|
||||
size_t operator() (util::point<S,T> p) const {
|
||||
std::hash<T> h;
|
||||
|
||||
size_t k = 0;
|
||||
|
@ -23,7 +23,8 @@ namespace util {
|
||||
template <size_t S, typename T>
|
||||
template <typename U>
|
||||
typename std::common_type<T,U>::type
|
||||
util::point<S,T>::distance (const point<S,U> &rhs) const {
|
||||
util::point<S,T>::distance (point<S,U> rhs) const
|
||||
{
|
||||
return std::sqrt (distance2 (rhs));
|
||||
}
|
||||
|
||||
@ -32,7 +33,8 @@ namespace util {
|
||||
template <size_t S, typename T>
|
||||
template <typename U>
|
||||
typename std::common_type<T,U>::type
|
||||
util::point<S,T>::distance2 (const point<S,U> &rhs) const {
|
||||
util::point<S,T>::distance2 (point<S,U> rhs) const
|
||||
{
|
||||
typedef typename std::common_type<T,U>::type result_t;
|
||||
|
||||
result_t sum { 0 };
|
||||
@ -48,7 +50,8 @@ namespace util {
|
||||
template <size_t S, typename T>
|
||||
template <typename U>
|
||||
typename std::common_type<T,U>::type
|
||||
util::point<S,T>::manhattan (const point<S,U> &rhs) const {
|
||||
util::point<S,T>::manhattan (point<S,U> rhs) const
|
||||
{
|
||||
typedef typename std::common_type<T,U>::type result_t;
|
||||
|
||||
result_t sum { 0 };
|
||||
|
Loading…
Reference in New Issue
Block a user