diff options
| author | Willem Jan Palenstijn <wjp@usecode.org> | 2016-04-15 17:00:31 +0200 | 
|---|---|---|
| committer | Willem Jan Palenstijn <wjp@usecode.org> | 2016-04-15 17:00:31 +0200 | 
| commit | 80bfa4774a408f109dd49a985a22ff64b08ce1df (patch) | |
| tree | 330cce11dfeb228b9df788720b4fdf2c79eb003c | |
| parent | 7633a0f48ce030413642627f16e50d27da4cf709 (diff) | |
| parent | 7b8a508f0bc7a8a02766b15fa094dfd18c1b0525 (diff) | |
| download | astra-80bfa4774a408f109dd49a985a22ff64b08ce1df.tar.gz astra-80bfa4774a408f109dd49a985a22ff64b08ce1df.tar.bz2 astra-80bfa4774a408f109dd49a985a22ff64b08ce1df.tar.xz astra-80bfa4774a408f109dd49a985a22ff64b08ce1df.zip | |
Merge pull request #29 from wjp/indexmanager
Add an AstraIndexManager
| -rw-r--r-- | include/astra/Algorithm.h | 4 | ||||
| -rw-r--r-- | include/astra/AstraObjectManager.h | 121 | ||||
| -rw-r--r-- | include/astra/Projector2D.h | 4 | ||||
| -rw-r--r-- | include/astra/Projector3D.h | 4 | ||||
| -rw-r--r-- | matlab/mex/astra_mex_c.cpp | 51 | ||||
| -rw-r--r-- | python/astra/PyIndexManager.pxd | 40 | ||||
| -rw-r--r-- | python/astra/astra.py | 20 | ||||
| -rw-r--r-- | python/astra/astra_c.pyx | 28 | ||||
| -rw-r--r-- | src/AstraObjectManager.cpp | 16 | 
9 files changed, 243 insertions, 45 deletions
| diff --git a/include/astra/Algorithm.h b/include/astra/Algorithm.h index 049417c..18c465f 100644 --- a/include/astra/Algorithm.h +++ b/include/astra/Algorithm.h @@ -81,7 +81,7 @@ public:  	 *  	 * @return initialized  	 */ -	bool isInitialized(); +	bool isInitialized() const;  	/** get a description of the class  	 * @@ -133,7 +133,7 @@ private:  // inline functions  inline std::string CAlgorithm::description() const { return "Algorithm"; }; -inline bool CAlgorithm::isInitialized() { return m_bIsInitialized; } +inline bool CAlgorithm::isInitialized() const { return m_bIsInitialized; }  } // end namespace diff --git a/include/astra/AstraObjectManager.h b/include/astra/AstraObjectManager.h index 895f955..ad89c2a 100644 --- a/include/astra/AstraObjectManager.h +++ b/include/astra/AstraObjectManager.h @@ -52,17 +52,49 @@ namespace astra {   * among all ObjectManagers.   */ +class CAstraObjectManagerBase { +public: +	virtual std::string getInfo(int index) const =0; +	virtual void remove(int index) =0; +	virtual std::string getType() const =0; +}; -class CAstraIndexManager { -protected: -	/** The index of the previously stored data object. + +class CAstraIndexManager : public Singleton<CAstraIndexManager> { +public: +	CAstraIndexManager() : m_iLastIndex(0) { } + +	int store(CAstraObjectManagerBase* m) { +		m_table[++m_iLastIndex] = m; +		return m_iLastIndex; +	} + +	CAstraObjectManagerBase* get(int index) const { +		std::map<int, CAstraObjectManagerBase*>::const_iterator i; +		i = m_table.find(index); +		if (i != m_table.end()) +			return i->second; +		else +			return 0; +	} + +	void remove(int index) { +		std::map<int, CAstraObjectManagerBase*>::iterator i; +		i = m_table.find(index); +		if (i != m_table.end()) +			m_table.erase(i); +	} + +private: +	/** The index last handed out  	 */ -	static int m_iPreviousIndex; +	int m_iLastIndex; +	std::map<int, CAstraObjectManagerBase*> m_table;  };  template <typename T> -class CAstraObjectManager : public Singleton<CAstraObjectManager<T> >, CAstraIndexManager { +class CAstraObjectManager : public CAstraObjectManagerBase {  public: @@ -117,7 +149,11 @@ public:  	 */  	void clear(); -	/** Get info. +	/** Get info of object. +	 */ +	std::string getInfo(int index) const; + +	/** Get list with info of all managed objects.  	 */  	std::string info(); @@ -149,9 +185,9 @@ CAstraObjectManager<T>::~CAstraObjectManager()  template <typename T>  int CAstraObjectManager<T>::store(T* _pDataObject)   { -	m_iPreviousIndex++; -	m_mIndexToObject[m_iPreviousIndex] = _pDataObject; -	return m_iPreviousIndex; +	int iIndex = CAstraIndexManager::getSingleton().store(this); +	m_mIndexToObject[iIndex] = _pDataObject; +	return iIndex;  }  //---------------------------------------------------------------------------------------- @@ -180,15 +216,16 @@ T* CAstraObjectManager<T>::get(int _iIndex) const  template <typename T>  void CAstraObjectManager<T>::remove(int _iIndex)  { -	if (!hasIndex(_iIndex)) { -		return; -	}  	// find data  	typename map<int,T*>::iterator it = m_mIndexToObject.find(_iIndex); +	if (it == m_mIndexToObject.end()) +		return;  	// delete data  	delete (*it).second;  	// delete from map -	m_mIndexToObject.erase(it);   +	m_mIndexToObject.erase(it); + +	CAstraIndexManager::getSingleton().remove(_iIndex);  }  //---------------------------------------------------------------------------------------- @@ -220,19 +257,29 @@ void CAstraObjectManager<T>::clear()  //----------------------------------------------------------------------------------------  // Print info to string  template <typename T> +std::string CAstraObjectManager<T>::getInfo(int index) const { +	typename map<int,T*>::const_iterator it = m_mIndexToObject.find(index); +	if (it == m_mIndexToObject.end()) +		return ""; +	const T* pObject = it->second; +	std::stringstream res; +	res << index << " \t"; +	if (pObject->isInitialized()) { +		res << "v     "; +	} else { +		res << "x     "; +	} +	res << pObject->description(); +	return res.str(); +} + +template <typename T>  std::string CAstraObjectManager<T>::info() {  	std::stringstream res;  	res << "id  init  description" << std::endl;  	res << "-----------------------------------------" << std::endl; -	for (typename map<int,T*>::iterator it = m_mIndexToObject.begin(); it != m_mIndexToObject.end(); it++) { -		res << (*it).first << " \t"; -		T* pObject = m_mIndexToObject[(*it).first]; -		if (pObject->isInitialized()) { -			res << "v     "; -		} else { -			res << "x     "; -		} -		res << pObject->description() << endl; +	for (typename map<int,T*>::const_iterator it = m_mIndexToObject.begin(); it != m_mIndexToObject.end(); it++) { +		res << getInfo(it->first) << endl;  	}  	res << "-----------------------------------------" << std::endl;  	return res.str(); @@ -247,42 +294,60 @@ std::string CAstraObjectManager<T>::info() {   * assigned to each data object by which it can be accessed in the future.   * Indices are always >= 1.   */ -class _AstraExport CProjector2DManager : public CAstraObjectManager<CProjector2D>{}; +class _AstraExport CProjector2DManager : public Singleton<CProjector2DManager>, public CAstraObjectManager<CProjector2D> +{ +	virtual std::string getType() const { return "projector2d"; } +};  /**   * This class contains functionality to store 3D projector objects.  A unique index handle will be    * assigned to each data object by which it can be accessed in the future.   * Indices are always >= 1.   */ -class _AstraExport CProjector3DManager : public CAstraObjectManager<CProjector3D>{}; +class _AstraExport CProjector3DManager : public Singleton<CProjector3DManager>, public CAstraObjectManager<CProjector3D> +{ +	virtual std::string getType() const { return "projector3d"; } +};  /**   * This class contains functionality to store 2D data objects.  A unique index handle will be    * assigned to each data object by which it can be accessed in the future.   * Indices are always >= 1.   */ -class _AstraExport CData2DManager : public CAstraObjectManager<CFloat32Data2D>{}; +class _AstraExport CData2DManager : public Singleton<CData2DManager>, public CAstraObjectManager<CFloat32Data2D> +{ +	virtual std::string getType() const { return "data2d"; } +};  /**   * This class contains functionality to store 3D data objects.  A unique index handle will be    * assigned to each data object by which it can be accessed in the future.   * Indices are always >= 1.   */ -class _AstraExport CData3DManager : public CAstraObjectManager<CFloat32Data3D>{}; +class _AstraExport CData3DManager : public Singleton<CData3DManager>, public CAstraObjectManager<CFloat32Data3D> +{ +	virtual std::string getType() const { return "data3d"; } +};  /**   * This class contains functionality to store algorithm objects.  A unique index handle will be    * assigned to each data object by which it can be accessed in the future.   * Indices are always >= 1.   */ -class _AstraExport CAlgorithmManager : public CAstraObjectManager<CAlgorithm>{}; +class _AstraExport CAlgorithmManager : public Singleton<CAlgorithmManager>, public CAstraObjectManager<CAlgorithm> +{ +	virtual std::string getType() const { return "algorithm"; } +};  /**   * This class contains functionality to store matrix objects.  A unique index handle will be    * assigned to each data object by which it can be accessed in the future.   * Indices are always >= 1.   */ -class _AstraExport CMatrixManager : public CAstraObjectManager<CSparseMatrix>{}; +class _AstraExport CMatrixManager : public Singleton<CMatrixManager>, public CAstraObjectManager<CSparseMatrix> +{ +	virtual std::string getType() const { return "matrix"; } +};  } // end namespace diff --git a/include/astra/Projector2D.h b/include/astra/Projector2D.h index a1ea0ce..c7a899d 100644 --- a/include/astra/Projector2D.h +++ b/include/astra/Projector2D.h @@ -174,7 +174,7 @@ public:  	 *  	 * @return initialized successfully  	 */ -	bool isInitialized(); +	bool isInitialized() const;  	/** get a description of the class  	 * @@ -191,7 +191,7 @@ private:  };  // inline functions -inline bool CProjector2D::isInitialized() { return m_bIsInitialized; } +inline bool CProjector2D::isInitialized() const { return m_bIsInitialized; }  inline CProjectionGeometry2D* CProjector2D::getProjectionGeometry() { return m_pProjectionGeometry; }  inline CVolumeGeometry2D* CProjector2D::getVolumeGeometry() { return m_pVolumeGeometry; } diff --git a/include/astra/Projector3D.h b/include/astra/Projector3D.h index 1ef1ba7..88ca2be 100644 --- a/include/astra/Projector3D.h +++ b/include/astra/Projector3D.h @@ -153,7 +153,7 @@ public:  	 *  	 * @return initialized successfully  	 */ -	bool isInitialized(); +	bool isInitialized() const;  	/** get a description of the class  	 * @@ -174,7 +174,7 @@ private:  };  // inline functions -inline bool CProjector3D::isInitialized() { return m_bIsInitialized; } +inline bool CProjector3D::isInitialized() const { return m_bIsInitialized; }  inline CProjectionGeometry3D* CProjector3D::getProjectionGeometry() { return m_pProjectionGeometry; }  inline CVolumeGeometry3D* CProjector3D::getVolumeGeometry() { return m_pVolumeGeometry; } diff --git a/matlab/mex/astra_mex_c.cpp b/matlab/mex/astra_mex_c.cpp index fdf4f33..f499528 100644 --- a/matlab/mex/astra_mex_c.cpp +++ b/matlab/mex/astra_mex_c.cpp @@ -36,10 +36,14 @@ $Id$  #include "mexInitFunctions.h"  #include "astra/Globals.h" +#include "astra/AstraObjectManager.h" +  #ifdef ASTRA_CUDA  #include "../cuda/2d/darthelper.h"  #include "astra/CompositeGeometryManager.h"  #endif + +  using namespace std;  using namespace astra; @@ -144,10 +148,51 @@ void astra_mex_version(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[  //----------------------------------------------------------------------------------------- +void astra_mex_info(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) +{ +	if (nrhs < 2) { +		mexErrMsgTxt("Usage: astra_mex('info', index/indices);\n"); +		return; +	} + +	for (int i = 1; i < nrhs; i++) { +		int iDataID = (int)(mxGetScalar(prhs[i])); +		CAstraObjectManagerBase *ptr; +		ptr = CAstraIndexManager::getSingleton().get(iDataID); +		if (ptr) { +			mexPrintf("%s\t%s\n", ptr->getType().c_str(), ptr->getInfo(iDataID).c_str()); +		} +	} + +} + +//----------------------------------------------------------------------------------------- + +void astra_mex_delete(int nlhs, mxArray* plhs[], int nrhs, const mxArray* prhs[]) +{ +	if (nrhs < 2) { +		mexErrMsgTxt("Usage: astra_mex('delete', index/indices);\n"); +		return; +	} + +	for (int i = 1; i < nrhs; i++) { +		int iDataID = (int)(mxGetScalar(prhs[i])); +		CAstraObjectManagerBase *ptr; +		ptr = CAstraIndexManager::getSingleton().get(iDataID); +		if (ptr) +			ptr->remove(iDataID); +	} + +} + + + +//----------------------------------------------------------------------------------------- +  static void printHelp()  {  	mexPrintf("Please specify a mode of operation.\n"); -	mexPrintf("   Valid modes: version, use_cuda, credits\n"); +	mexPrintf("   Valid modes: version, use_cuda, credits, set_gpu_index, info, delete\n");  }  //----------------------------------------------------------------------------------------- @@ -178,6 +223,10 @@ void mexFunction(int nlhs, mxArray* plhs[],  		astra_mex_credits(nlhs, plhs, nrhs, prhs);   	} else if (sMode == std::string("set_gpu_index")) {  		astra_mex_set_gpu_index(nlhs, plhs, nrhs, prhs); +	} else if (sMode == std::string("info")) { +		astra_mex_info(nlhs, plhs, nrhs, prhs); +	} else if (sMode == std::string("delete")) { +		astra_mex_delete(nlhs, plhs, nrhs, prhs);  	} else {  		printHelp();  	} diff --git a/python/astra/PyIndexManager.pxd b/python/astra/PyIndexManager.pxd new file mode 100644 index 0000000..c1ad502 --- /dev/null +++ b/python/astra/PyIndexManager.pxd @@ -0,0 +1,40 @@ +# ----------------------------------------------------------------------- +# Copyright: 2010-2016, iMinds-Vision Lab, University of Antwerp +#            2013-2016, CWI, Amsterdam +# +# Contact: astra@uantwerpen.be +# Website: http://sf.net/projects/astra-toolbox +# +# This file is part of the ASTRA Toolbox. +# +# +# The ASTRA Toolbox 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 3 of the License, or +# (at your option) any later version. +# +# The ASTRA Toolbox 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 the ASTRA Toolbox. If not, see <http://www.gnu.org/licenses/>. +# +# ----------------------------------------------------------------------- + +from libcpp.string cimport string + +from .PyIncludes cimport * + +cdef extern from "astra/AstraObjectManager.h" namespace "astra": +    cdef cppclass CAstraObjectManagerBase: +        string getInfo(int) +        void remove(int) +        string getType() +    cdef cppclass CAstraIndexManager: +        CAstraObjectManagerBase* get(int) + +cdef extern from "astra/AstraObjectManager.h" namespace "astra::CAstraIndexManager": +    cdef CAstraIndexManager* getSingletonPtr() + diff --git a/python/astra/astra.py b/python/astra/astra.py index 9328b6b..61c26ee 100644 --- a/python/astra/astra.py +++ b/python/astra/astra.py @@ -56,3 +56,23 @@ def set_gpu_index(idx, memory=0):      :type idx: :class:`int`      """      a.set_gpu_index(idx, memory) + +def delete(ids): +    """Delete an astra object. +     +    :param ids: ID or list of ID's to delete. +    :type ids: :class:`int` or :class:`list` +     +    """ +    return a.delete(ids) + +def info(ids): +    """Print info about an astra object. +     +    :param ids: ID or list of ID's to show. +    :type ids: :class:`int` or :class:`list` +     +    """ +    return a.info(ids) + + diff --git a/python/astra/astra_c.pyx b/python/astra/astra_c.pyx index baad853..8e30e69 100644 --- a/python/astra/astra_c.pyx +++ b/python/astra/astra_c.pyx @@ -33,6 +33,9 @@ from .utils import wrap_from_bytes  from libcpp.string cimport string  from libcpp.vector cimport vector  from libcpp cimport bool +cimport PyIndexManager +from .PyIndexManager cimport CAstraObjectManagerBase +  cdef extern from "astra/Globals.h" namespace "astra":      int getVersion()      string getVersionString() @@ -51,6 +54,7 @@ cdef extern from "astra/CompositeGeometryManager.h" namespace "astra":  cdef extern from "astra/CompositeGeometryManager.h" namespace "astra::CCompositeGeometryManager":      void setGlobalGPUParams(SGPUParams&) +  def credits():      six.print_("""The ASTRA Toolbox has been developed at the University of Antwerp and CWI, Amsterdam by   * Prof. dr. Joost Batenburg @@ -79,11 +83,10 @@ def version(printToScreen=False):  IF HAVE_CUDA==True:    def set_gpu_index(idx, memory=0): -    import types      import collections      cdef SGPUParams params      if use_cuda()==True: -        if not isinstance(idx, collections.Iterable) or isinstance(idx, types.StringTypes): +        if not isinstance(idx, collections.Iterable) or isinstance(idx, six.string_types + (six.text_type,six.binary_type)):              idx = (idx,)          params.memory = memory          params.GPUIndices = idx @@ -94,3 +97,24 @@ IF HAVE_CUDA==True:  ELSE:    def set_gpu_index(idx, memory=0):      raise NotImplementedError("CUDA support is not enabled in ASTRA") + +def delete(ids): +    import collections +    cdef CAstraObjectManagerBase* ptr +    if not isinstance(ids, collections.Iterable) or isinstance(ids, six.string_types + (six.text_type,six.binary_type)): +        ids = (ids,) +    for i in ids: +        ptr = PyIndexManager.getSingletonPtr().get(i) +        if ptr: +            ptr.remove(i) + +def info(ids): +    import collections +    cdef CAstraObjectManagerBase* ptr +    if not isinstance(ids, collections.Iterable) or isinstance(ids, six.string_types + (six.text_type,six.binary_type)): +        ids = (ids,) +    for i in ids: +        ptr = PyIndexManager.getSingletonPtr().get(i) +        if ptr: +            s = ptr.getType() + six.b("\t") + ptr.getInfo(i) +            six.print_(wrap_from_bytes(s)) diff --git a/src/AstraObjectManager.cpp b/src/AstraObjectManager.cpp index c49f273..46eae4b 100644 --- a/src/AstraObjectManager.cpp +++ b/src/AstraObjectManager.cpp @@ -31,13 +31,13 @@ $Id$  namespace astra { -int CAstraIndexManager::m_iPreviousIndex = 0; - -DEFINE_SINGLETON(CAstraObjectManager<CProjector2D>); -DEFINE_SINGLETON(CAstraObjectManager<CProjector3D>); -DEFINE_SINGLETON(CAstraObjectManager<CFloat32Data2D>); -DEFINE_SINGLETON(CAstraObjectManager<CFloat32Data3D>); -DEFINE_SINGLETON(CAstraObjectManager<CAlgorithm>); -DEFINE_SINGLETON(CAstraObjectManager<CSparseMatrix>); +DEFINE_SINGLETON(CProjector2DManager); +DEFINE_SINGLETON(CProjector3DManager); +DEFINE_SINGLETON(CData2DManager); +DEFINE_SINGLETON(CData3DManager); +DEFINE_SINGLETON(CAlgorithmManager); +DEFINE_SINGLETON(CMatrixManager); + +DEFINE_SINGLETON(CAstraIndexManager);  } // end namespace | 
