NEURON
ivocvect.h
Go to the documentation of this file.
1 #ifndef ivoc_vector_h
2 #define ivoc_vector_h
3 
4 // definition of vector classes from the gnu c++ class library
5 #include <nrnmutdec.h>
6 #include <vector>
7 #include <numeric>
8 #include <algorithm>
9 
10 extern "C" {
11 extern void notify_freed_val_array(double *, size_t);
12 }
13 
14 #define Vect IvocVect
15 using ParentVect = std::vector<double>;
16 struct Object;
17 
18 class IvocVect {
19 public:
20  IvocVect(Object* obj = NULL);
21  IvocVect(int, Object* obj = NULL);
22  IvocVect(int, double, Object* obj = NULL);
23  IvocVect(IvocVect&, Object* obj = NULL);
24  ~IvocVect();
25 
26  Object** temp_objvar();
27  int buffer_size();
28  void buffer_size(int);
29  void label(const char*);
30 
31  inline double& elem(int n) {
32  return vec_.at(n);
33  }
34 
35  inline std::vector<double>& vec() {
36  return vec_;
37  }
38 
39  inline double* data() {
40  return vec_.data();
41  }
42 
43  inline size_t size() const {
44  return vec_.size();
45  }
46 
47  inline void resize(size_t n) {
48  if(n > vec_.size()) {
49  notify_freed_val_array(vec_.data(), vec_.size());
50  }
51  vec_.resize(n);
52  }
53 
54  inline void resize(size_t n, double fill_value) {
55  if(n > vec_.size()) {
56  notify_freed_val_array(vec_.data(), vec_.size());
57  }
58  vec_.resize(n, fill_value);
59  }
60 
61  inline double& operator[] (size_t index) {
62  return vec_.at(index);
63  }
64 
65  inline auto begin() -> std::vector<double>::iterator {
66  return vec_.begin();
67  }
68 
69  inline auto end() -> std::vector<double>::iterator {
70  return vec_.end();
71  }
72 
73  inline void push_back(double v) {
74  vec_.push_back(v);
75  }
76 
77 #if USE_PTHREAD
78  void mutconstruct(int mkmut) {if (!mut_) MUTCONSTRUCT(mkmut)}
79 #else
80  void mutconstruct(int) {}
81 #endif
82  void lock() {MUTLOCK}
83  void unlock() {MUTUNLOCK}
84 public:
85  //intended as friend static Object** temp_objvar(IvocVect*);
86  Object* obj_; // so far only needed by record and play; not reffed
87  char* label_;
88  std::vector<double> vec_; // std::vector holding data
89  MUTDEC
90 };
91 
92 template< class InputIterator >
93 double var(InputIterator begin, InputIterator end) {
94  const size_t size = end-begin;
95  const double sum = std::accumulate(begin, end, 0.0);
96  const double m = sum / size;
97 
98  double accum = 0.0;
99  std::for_each (begin, end, [&](const double d) {
100  accum += (d - m) * (d - m);
101  });
102 
103  return accum / (size-1);
104 
105 }
106 
107 template< class InputIterator >
108 double stdDev(InputIterator begin, InputIterator end) {
109  return sqrt(var(begin, end));
110 }
111 
112 extern "C" {
113 extern Vect* vector_new(int, Object*); // use this if possible
114 extern Vect* vector_new0();
115 extern Vect* vector_new1(int);
116 extern Vect* vector_new2(Vect*);
117 extern void vector_delete(Vect*);
118 extern int vector_buffer_size(Vect*);
119 extern Object** vector_temp_objvar(Vect*);
120 extern Object** vector_pobj(Vect*);
121 
122 extern int is_vector_arg(int);
123 extern char* vector_get_label(Vect*);
124 extern void vector_set_label(Vect*, char*);
125 } // extern "C"
126 
127 #if defined(__cplusplus)
128 extern "C" {
129 #endif
130 
131 extern Vect* vector_arg(int);
132 extern double* vector_vec(Vect*);
133 extern int vector_capacity(Vect*);
134 extern void vector_resize(Vect*, int);
135 
136 #if defined(__cplusplus)
137 }
138 #endif
139 
140 #endif
141 
char * label_
Definition: ivocvect.h:87
Vect * vector_arg(int)
Definition: ivocvect.cpp:332
void vector_delete(Vect *)
Definition: ivocvect.cpp:266
#define Vect
Definition: ivocvect.h:14
Vect * vector_new0()
Definition: ivocvect.cpp:263
int vector_capacity(Vect *)
Definition: ivocvect.cpp:268
IvocVect(Object *obj=NULL)
Definition: ivocvect.cpp:164
size_t size() const
Definition: ivocvect.h:43
#define MUTLOCK
Definition: nrnmutdec.h:32
Object ** vector_pobj(Vect *)
Definition: ivocvect.cpp:272
void unlock()
Definition: ivocvect.h:83
#define MUTUNLOCK
Definition: nrnmutdec.h:33
#define v
Definition: md1redef.h:4
auto end() -> std::vector< double >::iterator
Definition: ivocvect.h:69
Object * obj_
Definition: ivocvect.h:86
void lock()
Definition: ivocvect.h:82
Vect * vector_new(int, Object *)
Definition: ivocvect.cpp:262
double * vector_vec(Vect *)
Definition: ivocvect.cpp:271
std::vector< double > & vec()
Definition: ivocvect.h:35
int const size_t const size_t n
Definition: nrngsl.h:12
#define MUTDEC
Definition: nrnmutdec.h:28
void notify_freed_val_array(double *, size_t)
Definition: ivoc.cpp:104
void vector_set_label(Vect *, char *)
Definition: ivocvect.cpp:274
double & elem(int n)
Definition: ivocvect.h:31
int is_vector_arg(int)
Definition: ivocvect.cpp:340
std::vector< double > vec_
Definition: ivocvect.h:88
std::vector< double > ParentVect
Definition: ivocvect.h:15
char * vector_get_label(Vect *)
Definition: ivocvect.cpp:273
void vector_resize(Vect *, int)
Definition: ivocvect.cpp:269
#define MUTCONSTRUCT(mkmut)
Definition: nrnmutdec.h:30
Object ** temp_objvar()
Definition: ivocvect.cpp:301
void mutconstruct(int)
Definition: ivocvect.h:80
auto begin() -> std::vector< double >::iterator
Definition: ivocvect.h:65
sqrt
Definition: extdef.h:3
Definition: hocdec.h:226
Vect * vector_new1(int)
Definition: ivocvect.cpp:264
int vector_buffer_size(Vect *)
Definition: ivocvect.cpp:267
Object ** vector_temp_objvar(Vect *)
Definition: ivocvect.cpp:270
double & operator[](size_t index)
Definition: ivocvect.h:61
void push_back(double v)
Definition: ivocvect.h:73
Vect * vector_new2(Vect *)
Definition: ivocvect.cpp:265
double stdDev(InputIterator begin, InputIterator end)
Definition: ivocvect.h:108
void label(const char *)
Definition: ivocvect.cpp:177
int buffer_size()
Definition: ivocvect.cpp:1289
double var(InputIterator begin, InputIterator end)
Definition: ivocvect.h:93
return NULL
Definition: cabcode.cpp:461
double * data()
Definition: ivocvect.h:39
short index
Definition: cabvars.h:11
void resize(size_t n, double fill_value)
Definition: ivocvect.h:54
void resize(size_t n)
Definition: ivocvect.h:47