diff --git a/cnorxz/base/base.pyx b/cnorxz/base/base.pyx index 9e7a4ab..07d4640 100644 --- a/cnorxz/base/base.pyx +++ b/cnorxz/base/base.pyx @@ -14,7 +14,7 @@ from range cimport cpp_RangeBase from range_factory cimport cpp_RangeFactoryBase, cpp_CRangeFactory from array cimport cpp_CArrayBase, cpp_MArray, cpp_AIndex from index cimport cpp_DIndex -from cereal cimport cpp_writeJSONFile +from cereal cimport cpp_writeJSONFile, cpp_writeBINARYFile, cpp_readJSONFile, cpp_readBINARYFile ## ============ @@ -133,9 +133,11 @@ cdef class Array: cdef class Array_Double (Array): cdef shared_ptr[cpp_CArrayBase[double]] cpp_array - def __cinit__(self,_range): - cdef Range r = _range - self.cpp_array = dynamic_pointer_cast[cpp_CArrayBase[double],cpp_MArray[double]] (make_shared[cpp_MArray[double]] (r.cpp_range) ) + def __cinit__(self,_range=None): + cdef Range r + if not _range is None: + r = _range + self.cpp_array = dynamic_pointer_cast[cpp_CArrayBase[double],cpp_MArray[double]] (make_shared[cpp_MArray[double]] (r.cpp_range) ) def size(self): return self.cpp_array.get().size() @@ -151,9 +153,11 @@ cdef class Array_Double (Array): cdef class Array_Range (Array): cdef shared_ptr[cpp_CArrayBase[shared_ptr[cpp_RangeBase]]] cpp_array - def __cinit__(self,_range): - cdef Range r = _range - self.cpp_array = dynamic_pointer_cast[cpp_CArrayBase[shared_ptr[cpp_RangeBase]],cpp_MArray[shared_ptr[cpp_RangeBase]]] (make_shared[cpp_MArray[shared_ptr[cpp_RangeBase]]] (r.cpp_range) ) + def __cinit__(self,_range=None): + cdef Range r + if not _range is None: + r = _range + self.cpp_array = dynamic_pointer_cast[cpp_CArrayBase[shared_ptr[cpp_RangeBase]],cpp_MArray[shared_ptr[cpp_RangeBase]]] (make_shared[cpp_MArray[shared_ptr[cpp_RangeBase]]] (r.cpp_range) ) def size(self): return self.cpp_array.get().size() @@ -162,6 +166,10 @@ cdef class Array_Range (Array): cdef Range r = Range() r.cpp_range = self.cpp_array.get().range() return r + + def index(self): + return AIndex_Range(self) + def getSubRange(_range): cdef Range r = _range @@ -169,19 +177,38 @@ def getSubRange(_range): a.cpp_array = dynamic_pointer_cast[cpp_CArrayBase[shared_ptr[cpp_RangeBase]],cpp_MArray[shared_ptr[cpp_RangeBase]]] (make_shared[cpp_MArray[shared_ptr[cpp_RangeBase]]] (r.cpp_range.get().sub()) ) return a -def writeJSONFile(_fname,_array): +def writeFile(_fname,_array,_format): cdef Array_Double a = _array cdef shared_ptr[cpp_MArray[double]] ap = dynamic_pointer_cast[cpp_MArray[double],cpp_CArrayBase[double]](a.cpp_array) - cpp_writeJSONFile[double](_fname, deref(ap.get())) + if _format.upper() == "JSON": + cpp_writeJSONFile[double](_fname, deref(ap.get())) + elif _format.upper() == "BINARY": + cpp_writeBINARYFile[double](_fname, deref(ap.get())) + else: + raise Exception("unknown array file format '{}'".format(_format)) + +def readFile(_fname,_format): + cdef Array_Double a = Array_Double() + cdef shared_ptr[cpp_MArray[double]] ap = make_shared[cpp_MArray[double]]() + a.cpp_array = dynamic_pointer_cast[cpp_CArrayBase[double],cpp_MArray[double]](ap) + if _format.upper() == "JSON": + cpp_readJSONFile[double](_fname, deref(ap.get())) + elif _format.upper() == "BINARY": + cpp_readBINARYFile[double](_fname, deref(ap.get())) + else: + raise Exception("unknown array file format '{}'".format(_format)) + return a cdef class AIndex_Double (Index): + cdef shared_ptr[cpp_CArrayBase[double]] cpp_array # keep the instance alive cdef shared_ptr[cpp_AIndex[double]] cpp_index cdef bool itercall def __cinit__(self,_array,_lexpos=0): cdef size_t l = _lexpos cdef Array_Double a = _array + self.cpp_array = a.cpp_array self.cpp_index = make_shared[cpp_AIndex[double]] (a.cpp_array.get().begin().A_plus(l)) self.itercall = False @@ -212,3 +239,46 @@ cdef class AIndex_Double (Index): def get(self): return self.cpp_index.get().A_get() + + +cdef class AIndex_Range (Index): + cdef shared_ptr[cpp_CArrayBase[shared_ptr[cpp_RangeBase]]] cpp_array # keep the instance alive + cdef shared_ptr[cpp_AIndex[shared_ptr[cpp_RangeBase]]] cpp_index + cdef bool itercall + + def __cinit__(self,_array,_lexpos=0): + cdef size_t l = _lexpos + cdef Array_Range a = _array + self.cpp_array = a.cpp_array + self.cpp_index = make_shared[cpp_AIndex[shared_ptr[cpp_RangeBase]]] (a.cpp_array.get().begin().A_plus(l)) + self.itercall = False + + def __iter__(self): + self.cpp_index.get().setlpos(0) + self.itercall = True # otherwise first (i.e. zeroth) will be excluded + return self + + def __next__(self): + cdef AIndex_Range ret = self + if self.itercall: + ret.itercall = False + return ret + if self.lex() < self.cpp_index.get().range().get().size()-1: + ret.cpp_index = make_shared[cpp_AIndex[shared_ptr[cpp_RangeBase]]] (self.cpp_index.get().A_plus(1)) + return ret + else: + raise StopIteration + + def lex(self): + return self.cpp_index.get().lex() + + def dim(self): + return self.cpp_index.get().dim() + + def stringMeta(self): + return self.cpp_index.get().stringMeta() + + def get(self): + cdef Range r = Range() + r.cpp_range = self.cpp_index.get().A_get() + return r diff --git a/cnorxz/base/cereal.pxd b/cnorxz/base/cereal.pxd index f31d89f..158c7dc 100644 --- a/cnorxz/base/cereal.pxd +++ b/cnorxz/base/cereal.pxd @@ -13,3 +13,12 @@ cdef extern from "cereal/cnorxz_cereal.h" namespace "CNORXZ::cer::Format": cdef extern from "cereal/cnorxz_cereal.h" namespace "CNORXZ::cer": cdef void cpp_writeJSONFile "CNORXZ::cer::writeJSONFile" [T] (const string&, const cpp_MArray[T]&) + +cdef extern from "cereal/cnorxz_cereal.h" namespace "CNORXZ::cer": + cdef void cpp_writeBINARYFile "CNORXZ::cer::writeBINARYFile" [T] (const string&, const cpp_MArray[T]&) + +cdef extern from "cereal/cnorxz_cereal.h" namespace "CNORXZ::cer": + cdef void cpp_readJSONFile "CNORXZ::cer::readJSONFile" [T] (const string&, cpp_MArray[T]&) + +cdef extern from "cereal/cnorxz_cereal.h" namespace "CNORXZ::cer": + cdef void cpp_readBINARYFile "CNORXZ::cer::readBINARYFile" [T] (const string&, cpp_MArray[T]&)