00001 #ifndef ivoc_vector_h 00002 #define ivoc_vector_h 00003 00004 // definition of vector classes from the gnu c++ class library 00005 #include <d_avec.h> 00006 #include <nrnmutdec.h> 00007 00008 #define ParentVect doubleAVec 00009 #define Vect IvocVect 00010 00011 struct Object; 00012 00013 class IvocVect : public ParentVect { 00014 public: 00015 IvocVect(Object* obj = nil); 00016 IvocVect(int, Object* obj = nil); 00017 IvocVect(int, double, Object* obj = nil); 00018 IvocVect(IvocVect&, Object* obj = nil); 00019 ~IvocVect(); 00020 00021 void resize(int); 00022 void resize_chunk(int len, int realloc_extra = 0); 00023 // volatile, only one at a time, don't do anything 00024 // that changes the memory space. 00025 IvocVect* subvec(int start, int end); 00026 00027 Object** temp_objvar(); 00028 int buffer_size(); 00029 void buffer_size(int); 00030 void label(const char*); 00031 00032 #if USE_PTHREAD 00033 void mutconstruct(int mkmut) {if (!mut_) MUTCONSTRUCT(mkmut)} 00034 #else 00035 void mutconstruct(int) {} 00036 #endif 00037 void lock() {MUTLOCK} 00038 void unlock() {MUTUNLOCK} 00039 public: 00040 //intended as friend static Object** temp_objvar(IvocVect*); 00041 Object* obj_; // so far only needed by record and play; not reffed 00042 char* label_; 00043 MUTDEC 00044 }; 00045 00046 00047 extern "C" { 00048 extern Vect* vector_new(int, Object*); // use this if possible 00049 extern Vect* vector_new0(); 00050 extern Vect* vector_new1(int); 00051 extern Vect* vector_new2(Vect*); 00052 extern void vector_delete(Vect*); 00053 extern int vector_buffer_size(Vect*); 00054 extern int vector_capacity(Vect*); 00055 extern void vector_resize(Vect*, int); 00056 extern Object** vector_temp_objvar(Vect*); 00057 extern double* vector_vec(Vect*); 00058 extern Object** vector_pobj(Vect*); 00059 extern Vect* vector_arg(int); 00060 extern boolean is_vector_arg(int); 00061 extern char* vector_get_label(Vect*); 00062 extern void vector_set_label(Vect*, char*); 00063 } 00064 00065 #endif 00066