1c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 2c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Copyright 2012 Francisco Jerez 3c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 4c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Permission is hereby granted, free of charge, to any person obtaining a 5c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// copy of this software and associated documentation files (the "Software"), 6c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// to deal in the Software without restriction, including without limitation 7c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// the rights to use, copy, modify, merge, publish, distribute, sublicense, 8c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// and/or sell copies of the Software, and to permit persons to whom the 9c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// Software is furnished to do so, subject to the following conditions: 10c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 11c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// The above copyright notice and this permission notice shall be included in 12c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// all copies or substantial portions of the Software. 13c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 14c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 15c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 16c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 17c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, 18c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF 19c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 20c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// SOFTWARE. 21c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez// 22c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 23c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#ifndef __CORE_GEOMETRY_HPP__ 24c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#define __CORE_GEOMETRY_HPP__ 25c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 26c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <array> 27c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#include <algorithm> 28c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 29c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jereznamespace clover { 30c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez /// 31c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez /// N-dimensional coordinate array. 32c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez /// 33c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez template<typename T, int N> 34c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez class point { 35c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez public: 36c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez point() : a() { 37c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 38c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 39c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez point(std::initializer_list<T> v) { 40c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez auto it = std::copy(v.begin(), v.end(), a.begin()); 41c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::fill(it, a.end(), 0); 42c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 43c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 44c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez point(const T *v) { 45c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::copy(v, v + N, a.begin()); 46c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 47c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 48c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez T &operator[](int i) { 49c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return a[i]; 50c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 51c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 52c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez const T &operator[](int i) const { 53c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return a[i]; 54c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 55c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 56c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez point operator+(const point &p) const { 57c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez point q; 58c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::transform(a.begin(), a.end(), p.a.begin(), 59c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez q.a.begin(), std::plus<T>()); 60c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return q; 61c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 62c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 63c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez T operator()(const point &p) const { 64c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez return std::inner_product(p.a.begin(), p.a.end(), a.begin(), 0); 65c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez } 66c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 67c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez protected: 68c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez std::array<T, N> a; 69c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez }; 70c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez} 71c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez 72c6db1b3396384186aab5b685fe1fd540e17b3a62Francisco Jerez#endif 73