2018-02-24 22:25:39 +00:00
|
|
|
/*************************************************************************************
|
|
|
|
|
|
|
|
Grid physics library, www.github.com/paboyle/Grid
|
|
|
|
|
|
|
|
Source file: ./lib/cartesian/Coordinate.h
|
|
|
|
|
|
|
|
Copyright (C) 2018
|
|
|
|
|
|
|
|
Author: Peter Boyle <paboyle@ph.ed.ac.uk>
|
|
|
|
|
|
|
|
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; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
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 for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License along
|
|
|
|
with this program; if not, write to the Free Software Foundation, Inc.,
|
|
|
|
51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
|
|
|
|
|
|
|
|
See the full license in the file "LICENSE" in the top level distribution directory
|
|
|
|
*************************************************************************************/
|
|
|
|
/* END LEGAL */
|
|
|
|
#pragma once
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
// Provide a stack resident container for coordinates, or extents
|
|
|
|
////////////////////////////////////////////////////////////////////////////
|
|
|
|
NAMESPACE_BEGIN(Grid);
|
|
|
|
template<class _T,int MaxEntries>
|
|
|
|
class AcceleratorVector {
|
|
|
|
public:
|
|
|
|
|
|
|
|
typedef _T value;
|
|
|
|
typedef int size_type;
|
|
|
|
typedef value & reference;
|
|
|
|
typedef const value & const_reference;
|
|
|
|
typedef value * pointer;
|
|
|
|
typedef const value * const_pointer;
|
|
|
|
|
|
|
|
private:
|
|
|
|
value _data[MaxEntries];
|
|
|
|
size_type _size;
|
|
|
|
|
|
|
|
public:
|
|
|
|
accelerator_inline reference operator[](size_type __n) { return _data[__n];}
|
|
|
|
accelerator_inline const_reference operator[](size_type __n) const { return _data[__n];}
|
|
|
|
accelerator_inline size_type size(void) const { return _size; };
|
|
|
|
accelerator_inline void clear(void) { resize(0);}
|
|
|
|
accelerator_inline void resize(size_type sz) {
|
|
|
|
assert(sz>=0);
|
2018-03-09 20:00:46 +00:00
|
|
|
assert(sz<=MaxEntries);
|
2018-02-24 22:25:39 +00:00
|
|
|
_size = sz;
|
|
|
|
}
|
|
|
|
accelerator_inline void resize(size_type sz,const value &val) {
|
|
|
|
assert(sz>=0);
|
2018-03-09 18:10:21 +00:00
|
|
|
assert(sz<=MaxEntries);
|
2018-02-24 22:25:39 +00:00
|
|
|
_size = sz;
|
|
|
|
for(int s=0;s<sz;s++) _data[s]=val;
|
|
|
|
}
|
|
|
|
accelerator_inline pointer begin(void) { return _data; }
|
|
|
|
accelerator_inline pointer end (void) { return &_data[_size]; }
|
|
|
|
accelerator_inline void push_back(const value &val) { resize(_size+1); _data[_size-1] = val;}
|
|
|
|
accelerator_inline AcceleratorVector() { _size = 0; }
|
|
|
|
accelerator_inline AcceleratorVector(size_type sz) { resize(sz); }
|
|
|
|
accelerator_inline AcceleratorVector(size_type sz,const value &val) { resize(sz,val); }
|
|
|
|
AcceleratorVector(const std::vector<value> ©me) {
|
|
|
|
resize(copyme.size());
|
|
|
|
for(int s=0;s<_size;s++){
|
|
|
|
_data[s] = copyme[s];
|
|
|
|
}
|
|
|
|
}
|
|
|
|
std::vector<value> toVector(void) const {
|
|
|
|
auto clone =*this;
|
|
|
|
std::vector<value> ret;
|
|
|
|
std::copy(clone.begin(),clone.end(),std::back_inserter(ret));
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
|
|
// Coordinate class, maxdims = 8 for now.
|
|
|
|
////////////////////////////////////////////////////////////////
|
|
|
|
#define GRID_MAX_LATTICE_DIMENSION (8)
|
|
|
|
#define GRID_MAX_SIMD (16)
|
|
|
|
|
|
|
|
static constexpr int MaxDims = GRID_MAX_LATTICE_DIMENSION;
|
|
|
|
|
|
|
|
typedef AcceleratorVector<int,MaxDims> Coordinate;
|
|
|
|
|
|
|
|
inline std::ostream & operator<<(std::ostream &os, const Coordinate &v)
|
|
|
|
{
|
|
|
|
os << "[";
|
|
|
|
for(int s=0;s<v.size();s++) {
|
|
|
|
os << v[s] << " ";
|
|
|
|
}
|
|
|
|
if (v.size() > 0) {
|
|
|
|
os << "\b";
|
|
|
|
}
|
|
|
|
os << "]";
|
|
|
|
return os;
|
|
|
|
}
|
|
|
|
|
|
|
|
NAMESPACE_END(Grid);
|