Skip to content

Commit dd85c49

Browse files
author
contuandrea
committed
Constrain template member functions in preparemaps.h
1 parent ea0a7ef commit dd85c49

File tree

1 file changed

+72
-43
lines changed

1 file changed

+72
-43
lines changed

include/maps/preparemaps.h

Lines changed: 72 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,8 @@ namespace maps{
5555
bool _gridyfied=false;
5656
double _scalespace=1.;
5757
double _scalefield=1.;
58+
bool _has_active_flag=false;
59+
std::string _active_flag="";
5860
//data points container
5961
hydra::multiarray<MP,3,hydra::host::sys_t> _extremes;
6062
hydra::multiarray<MP,N,hydra::host::sys_t> _data;
@@ -79,18 +81,22 @@ namespace maps{
7981
physmap(){
8082
}
8183

82-
physmap(std::string s, size_t skipcolumns=0, size_t skiprows=0, double scale=1., double scalespace=1., bool sparse=false){
83-
this->init(s,skipcolumns,skiprows,scale,scalespace,sparse);
84+
physmap(std::string s, size_t skipcolumns=0, size_t skiprows=0, double scale=1., double scalespace=1., bool sparse=false, std::string search_active=""){
85+
this->init(s,skipcolumns,skiprows,scale,scalespace,sparse,search_active);
8486
}
8587

86-
void init(std::string s, size_t skipcolumns=0, size_t skiprows=0, double scale=1., double scalespace=1., bool sparse=false){
88+
void init(std::string s, size_t skipcolumns=0, size_t skiprows=0, double scale=1., double scalespace=1., bool sparse=false, std::string search_active=""){
8789
_filename=s;
8890
_cskip=skipcolumns;
8991
_rskip=skiprows;
9092
_sparse=false;
9193
_gridyfied=false;
9294
_scalefield=scale;
9395
_scalespace=scalespace;
96+
if(search_active!=""){
97+
_has_active_flag = true;
98+
_active_flag = search_active;
99+
}
94100
}
95101

96102
void prepare(){
@@ -139,70 +145,96 @@ namespace maps{
139145
hydra::copy(hydra::make_range(_data.begin(_3),_data.end(_3)),v);
140146
}
141147

148+
149+
template <typename Container, typename ElemType = decltype(*(std::declval<Container>().begin()))>
150+
std::enable_if_t< hydra::tuple_size< ElemType >::value == 2 && N==5, void >
151+
fillscalar_and_active(Container &v){
152+
v.resize(_data.size());
153+
hydra::copy(hydra::make_range(_data.begin(_3,_4),_data.end(_3,_4)),v);
154+
}
155+
142156
template <typename Container>
143-
void fillemobility(Container &v){
157+
std::enable_if<N==11 || N==12, void >
158+
fillemobility(Container &v){
144159
v.resize(_data.size());
145160
hydra::copy(hydra::make_range(_data.begin(_6),_data.end(_6)),v);
146161
}
147162

163+
template <typename Container, typename ElemType = decltype(*(std::declval<Container>().begin()))>
164+
std::enable_if_t< hydra::tuple_size< ElemType >::value == 2 && N==12, void >
165+
fillemobility_and_active(Container &v){
166+
v.resize(_data.size());
167+
hydra::copy(hydra::make_range(_data.begin(_6,_11),_data.end(_6,_11)),v);
168+
}
169+
148170
template <typename Container>
149-
void fillhmobility(Container &v){
171+
std::enable_if<N==11 || N==12, void >
172+
fillhmobility(Container &v){
150173
v.resize(_data.size());
151174
hydra::copy(hydra::make_range(_data.begin(_7),_data.end(_7)),v);
152175
}
153176

154-
template <typename Container>
155-
void fillvector(Container &vx, Container &vy, Container &vz){
156-
vx.resize(_data.size());
157-
vy.resize(_data.size());
158-
vz.resize(_data.size());
159-
hydra::copy(hydra::make_range(_data.begin(_3),_data.end(_3)),vx);
160-
hydra::copy(hydra::make_range(_data.begin(_4),_data.end(_4)),vy);
161-
hydra::copy(hydra::make_range(_data.begin(_5),_data.end(_5)),vz);
177+
template <typename Container, typename ElemType = decltype(*(std::declval<Container>().begin()))>
178+
std::enable_if_t< hydra::tuple_size< ElemType >::value == 2 && N==11, void >
179+
fillhmobility_and_active(Container &v){
180+
v.resize(_data.size());
181+
hydra::copy(hydra::make_range(_data.begin(_7,_11),_data.end(_7,_11)),v);
162182
}
163183

164-
template <typename Container>
165-
void fillvector(Container &vect){
184+
template <typename Container, typename ElemType = decltype(*(std::declval<Container>().begin()))>
185+
std::enable_if_t< hydra::tuple_size< ElemType >::value == 3 && (N==6 || N==7), void >
186+
fillvector(Container &vect){
166187
vect.resize(_data.size());
167188
hydra::copy(hydra::make_range(_data.begin(_3,_4,_5),_data.end(_3,_4,_5)),vect);
168189
}
169190

170-
template <typename Container>
171-
void fillvectorEfield(Container &vect){
191+
template <typename Container, typename ElemType = decltype(*(std::declval<Container>().begin()))>
192+
std::enable_if_t< hydra::tuple_size< ElemType >::value == 4 && N==7, void >
193+
fillvector_and_active(Container &vect){
194+
vect.resize(_data.size());
195+
hydra::copy(hydra::make_range(_data.begin(_3,_4,_5,_6),_data.end(_3,_4,_5,_6)),vect);
196+
}
197+
198+
template <typename Container, typename ElemType = decltype(*(std::declval<Container>().begin()))>
199+
std::enable_if_t< hydra::tuple_size< ElemType >::value == 3 && (N==11 || N==12), void >
200+
fillvectorEfield(Container &vect){
172201
vect.resize(_data.size());
173202
hydra::copy(hydra::make_range(_data.begin(_3,_4,_5),_data.end(_3,_4,_5)),vect);
174203
}
175204

176-
template <typename Container>
177-
void fillvectorWfield(Container &vect){
205+
template <typename Container, typename ElemType = decltype(*(std::declval<Container>().begin()))>
206+
std::enable_if_t< hydra::tuple_size< ElemType >::value == 4 && N==12, void >
207+
fillvectorEfield_and_active(Container &vect){
208+
vect.resize(_data.size());
209+
hydra::copy(hydra::make_range(_data.begin(_3,_4,_5,_11),_data.end(_3,_4,_5,_11)),vect);
210+
}
211+
212+
template <typename Container, typename ElemType = decltype(*(std::declval<Container>().begin()))>
213+
std::enable_if_t< hydra::tuple_size< ElemType >::value == 3 && (N==11 || N==12), void >
214+
fillvectorWfield(Container &vect){
178215
vect.resize(_data.size());
179216
hydra::copy(hydra::make_range(_data.begin(_8,_9,_10),_data.end(_8,_9,_10)),vect);
180217
}
181218

182-
template <typename Container>
183-
void fillallquantities(Container &fields){
219+
template <typename Container, typename ElemType = decltype(*(std::declval<Container>().begin()))>
220+
std::enable_if_t< hydra::tuple_size< ElemType >::value == 4 && N==12, void >
221+
fillvectorWfield_and_active(Container &vect){
222+
vect.resize(_data.size());
223+
hydra::copy(hydra::make_range(_data.begin(_8,_9,_10,_11),_data.end(_8,_9,_10,_11)),vect);
224+
}
225+
226+
template <typename Container, typename ElemType = decltype(*(std::declval<Container>().begin()))>
227+
std::enable_if_t< hydra::tuple_size< ElemType >::value == 8 && (N==11 || N==12), void >
228+
fillallquantities(Container &fields){
184229
fields.resize(_data.size());
185230
hydra::copy(hydra::make_range(_data.begin(_3,_4,_5,_6,_7,_8,_9,_10),_data.end(_3,_4,_5,_6,_7,_8,_9,_10)),fields);
186231
}
187-
188-
template <typename Container>
189-
void fillallquantities(Container &ex, Container &ey, Container &ez, Container &emob, Container &hmob, Container &wx, Container &wy, Container &wz){
190-
ex.resize(_data.size());
191-
ey.resize(_data.size());
192-
ez.resize(_data.size());
193-
wx.resize(_data.size());
194-
wy.resize(_data.size());
195-
wz.resize(_data.size());
196-
emob.resize(_data.size());
197-
hmob.resize(_data.size());
198-
hydra::copy(hydra::make_range(_data.begin(_3),_data.end(_3)),ex);
199-
hydra::copy(hydra::make_range(_data.begin(_4),_data.end(_4)),ey);
200-
hydra::copy(hydra::make_range(_data.begin(_5),_data.end(_5)),ez);
201-
hydra::copy(hydra::make_range(_data.begin(_6),_data.end(_6)),emob);
202-
hydra::copy(hydra::make_range(_data.begin(_7),_data.end(_7)),hmob);
203-
hydra::copy(hydra::make_range(_data.begin(_8),_data.end(_8)),wx);
204-
hydra::copy(hydra::make_range(_data.begin(_9),_data.end(_9)),wy);
205-
hydra::copy(hydra::make_range(_data.begin(_10),_data.end(_10)),wz);
232+
233+
template <typename Container, typename ElemType = decltype(*(std::declval<Container>().begin()))>
234+
std::enable_if_t< hydra::tuple_size< ElemType >::value == 9 && N==12, void >
235+
fillallquantities_and_active(Container &fields){
236+
fields.resize(_data.size());
237+
hydra::copy(hydra::make_range(_data.begin(_3,_4,_5,_6,_7,_8,_9,_10,_11),_data.end(_3,_4,_5,_6,_7,_8,_9,_10,_11)),fields);
206238
}
207239

208240
};
@@ -576,7 +608,6 @@ namespace maps{
576608
}
577609

578610
void load(std::string map_path){
579-
INFO_LINE("Loading single map")
580611
_pm.init(map_path);
581612
_pm.prepare();
582613
std::get<0>(_borders) = *(_pm.getx().begin());
@@ -592,8 +623,6 @@ namespace maps{
592623
}
593624

594625
void load(std::string efield_path, std::string emob_path, std::string hmob_path, std::string wfield_path){
595-
INFO_LINE("Loading separate maps")
596-
597626
//get efield
598627
_efieldm.init(efield_path); //E field is a vector
599628
_efieldm.prepare();

0 commit comments

Comments
 (0)