From 47fe3421585302f2101691a685ab99b0e1ad5cfc Mon Sep 17 00:00:00 2001
From: Willem Jan Palenstijn <wjp@usecode.org>
Date: Fri, 1 May 2015 17:48:32 +0200
Subject: Change XMLNode* to XMLNode

An XMLNode object is already simply a pointer, so no need to dynamically allocate XMLNodes.
---
 src/ArtAlgorithm.cpp                        |   6 +-
 src/ConeProjectionGeometry3D.cpp            |  26 +++--
 src/ConeVecProjectionGeometry3D.cpp         |  25 ++---
 src/Config.cpp                              |  19 ++--
 src/CudaBackProjectionAlgorithm3D.cpp       |   6 +-
 src/CudaCglsAlgorithm3D.cpp                 |   6 +-
 src/CudaDartMaskAlgorithm.cpp               |  22 ++--
 src/CudaDartMaskAlgorithm3D.cpp             |  22 ++--
 src/CudaDartSmoothingAlgorithm.cpp          |  20 ++--
 src/CudaDartSmoothingAlgorithm3D.cpp        |  20 ++--
 src/CudaDataOperationAlgorithm.cpp          |  25 ++---
 src/CudaFDKAlgorithm3D.cpp                  |   6 +-
 src/CudaFilteredBackProjectionAlgorithm.cpp |  44 ++++----
 src/CudaForwardProjectionAlgorithm.cpp      |  23 ++---
 src/CudaForwardProjectionAlgorithm3D.cpp    |  21 ++--
 src/CudaProjector2D.cpp                     |   5 +-
 src/CudaProjector3D.cpp                     |   5 +-
 src/CudaReconstructionAlgorithm2D.cpp       |  49 +++++----
 src/CudaRoiSelectAlgorithm.cpp              |  13 ++-
 src/CudaSartAlgorithm.cpp                   |   4 +-
 src/CudaSirtAlgorithm.cpp                   |   8 +-
 src/CudaSirtAlgorithm3D.cpp                 |   6 +-
 src/FanFlatProjectionGeometry2D.cpp         |  22 ++--
 src/FanFlatVecProjectionGeometry2D.cpp      |  18 ++--
 src/FilteredBackProjectionAlgorithm.cpp     |  20 ++--
 src/ForwardProjectionAlgorithm.cpp          |  23 ++---
 src/ParallelBeamBlobKernelProjector2D.cpp   |  22 ++--
 src/ParallelProjectionGeometry2D.cpp        |   8 +-
 src/ParallelProjectionGeometry3D.cpp        |  12 +--
 src/ParallelVecProjectionGeometry3D.cpp     |  25 ++---
 src/ProjectionGeometry2D.cpp                |  17 ++-
 src/ProjectionGeometry3D.cpp                |  25 ++---
 src/Projector2D.cpp                         |   6 +-
 src/Projector3D.cpp                         |   8 +-
 src/ReconstructionAlgorithm2D.cpp           |  39 ++++---
 src/ReconstructionAlgorithm3D.cpp           |  36 +++----
 src/SartAlgorithm.cpp                       |   4 +-
 src/SparseMatrixProjectionGeometry2D.cpp    |  15 ++-
 src/VolumeGeometry2D.cpp                    |  30 +++---
 src/VolumeGeometry3D.cpp                    |  45 ++++----
 src/XMLDocument.cpp                         |   5 +-
 src/XMLNode.cpp                             | 155 ++++++++++++----------------
 42 files changed, 410 insertions(+), 506 deletions(-)

(limited to 'src')

diff --git a/src/ArtAlgorithm.cpp b/src/ArtAlgorithm.cpp
index 8f058a3..6a699ec 100644
--- a/src/ArtAlgorithm.cpp
+++ b/src/ArtAlgorithm.cpp
@@ -132,7 +132,7 @@ bool CArtAlgorithm::initialize(const Config& _cfg)
 	}
 
 	// ray order
-	string projOrder = _cfg.self->getOption("RayOrder", "sequential");
+	string projOrder = _cfg.self.getOption("RayOrder", "sequential");
 	CC.markOptionParsed("RayOrder");
 	m_iCurrentRay = 0;
 	m_iRayCount = m_pProjector->getProjectionGeometry()->getProjectionAngleCount() * 
@@ -145,7 +145,7 @@ bool CArtAlgorithm::initialize(const Config& _cfg)
 			m_piDetectorOrder[i] = i % m_pProjector->getProjectionGeometry()->getDetectorCount();
 		}
 	} else if (projOrder == "custom") {
-		vector<float32> rayOrderList = _cfg.self->getOptionNumericalArray("RayOrderList");
+		vector<float32> rayOrderList = _cfg.self.getOptionNumericalArray("RayOrderList");
 		m_iRayCount = rayOrderList.size() / 2;
 		m_piProjectionOrder = new int[m_iRayCount];
 		m_piDetectorOrder = new int[m_iRayCount];
@@ -158,7 +158,7 @@ bool CArtAlgorithm::initialize(const Config& _cfg)
 		return false;
 	}
 
-	m_fLambda = _cfg.self->getOptionNumerical("Lambda", 1.0f);
+	m_fLambda = _cfg.self.getOptionNumerical("Lambda", 1.0f);
 	CC.markOptionParsed("Lambda");
 
 	// success
diff --git a/src/ConeProjectionGeometry3D.cpp b/src/ConeProjectionGeometry3D.cpp
index 1976901..dd22eba 100644
--- a/src/ConeProjectionGeometry3D.cpp
+++ b/src/ConeProjectionGeometry3D.cpp
@@ -87,17 +87,15 @@ bool CConeProjectionGeometry3D::initialize(const Config& _cfg)
 	CProjectionGeometry3D::initialize(_cfg);
 
 	// Required: DistanceOriginDetector
-	XMLNode* node = _cfg.self->getSingleNode("DistanceOriginDetector");
+	XMLNode node = _cfg.self.getSingleNode("DistanceOriginDetector");
 	ASTRA_CONFIG_CHECK(node, "ConeProjectionGeometry3D", "No DistanceOriginDetector tag specified.");
-	m_fOriginDetectorDistance = boost::lexical_cast<float32>(node->getContent());
-	ASTRA_DELETE(node);
+	m_fOriginDetectorDistance = boost::lexical_cast<float32>(node.getContent());
 	CC.markNodeParsed("DistanceOriginDetector");
 
 	// Required: DetectorOriginSource
-	node = _cfg.self->getSingleNode("DistanceOriginSource");
+	node = _cfg.self.getSingleNode("DistanceOriginSource");
 	ASTRA_CONFIG_CHECK(node, "ConeProjectionGeometry3D", "No DistanceOriginSource tag specified.");
-	m_fOriginSourceDistance = boost::lexical_cast<float32>(node->getContent());
-	ASTRA_DELETE(node);
+	m_fOriginSourceDistance = boost::lexical_cast<float32>(node.getContent());
 	CC.markNodeParsed("DistanceOriginSource");
 
 	// success
@@ -193,14 +191,14 @@ Config* CConeProjectionGeometry3D::getConfiguration() const
 {
 	Config* cfg = new Config();
 	cfg->initialize("ProjectionGeometry3D");
-	cfg->self->addAttribute("type", "cone");
-	cfg->self->addChildNode("DetectorSpacingX", m_fDetectorSpacingX);
-	cfg->self->addChildNode("DetectorSpacingY", m_fDetectorSpacingY);
-	cfg->self->addChildNode("DetectorRowCount", m_iDetectorRowCount);
-	cfg->self->addChildNode("DetectorColCount", m_iDetectorColCount);
-	cfg->self->addChildNode("DistanceOriginDetector", m_fOriginDetectorDistance);
-	cfg->self->addChildNode("DistanceOriginSource", m_fOriginSourceDistance);
-	cfg->self->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
+	cfg->self.addAttribute("type", "cone");
+	cfg->self.addChildNode("DetectorSpacingX", m_fDetectorSpacingX);
+	cfg->self.addChildNode("DetectorSpacingY", m_fDetectorSpacingY);
+	cfg->self.addChildNode("DetectorRowCount", m_iDetectorRowCount);
+	cfg->self.addChildNode("DetectorColCount", m_iDetectorColCount);
+	cfg->self.addChildNode("DistanceOriginDetector", m_fOriginDetectorDistance);
+	cfg->self.addChildNode("DistanceOriginSource", m_fOriginSourceDistance);
+	cfg->self.addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
 	return cfg;
 }
 
diff --git a/src/ConeVecProjectionGeometry3D.cpp b/src/ConeVecProjectionGeometry3D.cpp
index 9dc273d..47ed630 100644
--- a/src/ConeVecProjectionGeometry3D.cpp
+++ b/src/ConeVecProjectionGeometry3D.cpp
@@ -73,33 +73,30 @@ bool CConeVecProjectionGeometry3D::initialize(const Config& _cfg)
 	ASTRA_ASSERT(_cfg.self);
 	ConfigStackCheck<CProjectionGeometry3D> CC("ConeVecProjectionGeometry3D", this, _cfg);	
 
-	XMLNode* node;
+	XMLNode node;
 
 	// TODO: Fix up class hierarchy... this class doesn't fit very well.
 	// initialization of parent class
 	//CProjectionGeometry3D::initialize(_cfg);
 
 	// Required: DetectorRowCount
-	node = _cfg.self->getSingleNode("DetectorRowCount");
+	node = _cfg.self.getSingleNode("DetectorRowCount");
 	ASTRA_CONFIG_CHECK(node, "ConeVecProjectionGeometry3D", "No DetectorRowCount tag specified.");
-	m_iDetectorRowCount = boost::lexical_cast<int>(node->getContent());
-	ASTRA_DELETE(node);
+	m_iDetectorRowCount = boost::lexical_cast<int>(node.getContent());
 	CC.markNodeParsed("DetectorRowCount");
 
 	// Required: DetectorColCount
-	node = _cfg.self->getSingleNode("DetectorColCount");
+	node = _cfg.self.getSingleNode("DetectorColCount");
 	ASTRA_CONFIG_CHECK(node, "ConeVecProjectionGeometry3D", "No DetectorColCount tag specified.");
-	m_iDetectorColCount = boost::lexical_cast<int>(node->getContent());
+	m_iDetectorColCount = boost::lexical_cast<int>(node.getContent());
 	m_iDetectorTotCount = m_iDetectorRowCount * m_iDetectorColCount;
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("DetectorColCount");
 
 	// Required: Vectors
-	node = _cfg.self->getSingleNode("Vectors");
+	node = _cfg.self.getSingleNode("Vectors");
 	ASTRA_CONFIG_CHECK(node, "ConeVecProjectionGeometry3D", "No Vectors tag specified.");
-	vector<double> data = node->getContentNumericalArrayDouble();
+	vector<double> data = node.getContentNumericalArrayDouble();
 	CC.markNodeParsed("Vectors");
-	ASTRA_DELETE(node);
 	ASTRA_CONFIG_CHECK(data.size() % 12 == 0, "ConeVecProjectionGeometry3D", "Vectors doesn't consist of 12-tuples.");
 	m_iProjectionAngleCount = data.size() / 12;
 	m_pProjectionAngles = new SConeProjection[m_iProjectionAngleCount];
@@ -208,9 +205,9 @@ Config* CConeVecProjectionGeometry3D::getConfiguration() const
 	Config* cfg = new Config();
 	cfg->initialize("ProjectionGeometry3D");
 
-	cfg->self->addAttribute("type", "cone_vec");
-	cfg->self->addChildNode("DetectorRowCount", m_iDetectorRowCount);
-	cfg->self->addChildNode("DetectorColCount", m_iDetectorColCount);
+	cfg->self.addAttribute("type", "cone_vec");
+	cfg->self.addChildNode("DetectorRowCount", m_iDetectorRowCount);
+	cfg->self.addChildNode("DetectorColCount", m_iDetectorColCount);
 
 	std::string vectors = "";
 	for (int i = 0; i < m_iProjectionAngleCount; ++i) {
@@ -229,7 +226,7 @@ Config* CConeVecProjectionGeometry3D::getConfiguration() const
 		vectors += boost::lexical_cast<string>(p.fDetVZ);
 		if (i < m_iProjectionAngleCount-1) vectors += ';';
 	}
-	cfg->self->addChildNode("Vectors", vectors);
+	cfg->self.addChildNode("Vectors", vectors);
 
 	return cfg;
 }
diff --git a/src/Config.cpp b/src/Config.cpp
index 32e5ed9..395080b 100644
--- a/src/Config.cpp
+++ b/src/Config.cpp
@@ -45,15 +45,14 @@ using namespace std;
 
 //-----------------------------------------------------------------------------
 // default constructor
-Config::Config()
+Config::Config() : self()
 {
-	self = 0;
 	_doc = 0;
 }
 
 //-----------------------------------------------------------------------------
 // not so default constructor
-Config::Config(XMLNode* _self) 
+Config::Config(XMLNode _self)
 {
 	self = _self;
 	_doc = 0;
@@ -62,8 +61,6 @@ Config::Config(XMLNode* _self)
 //-----------------------------------------------------------------------------
 Config::~Config()
 {
-	delete self;
-	self = 0;
 	delete _doc;
 	_doc = 0;
 }
@@ -71,7 +68,7 @@ Config::~Config()
 //-----------------------------------------------------------------------------
 void Config::initialize(std::string rootname)
 {
-	if (self == 0) {
+	if (!self) {
 		XMLDocument* doc = XMLDocument::createDocument(rootname);
 		self = doc->getRootNode();		
 		_doc = doc;
@@ -129,13 +126,13 @@ bool ConfigStackCheck<T>::stopParsing()
 
 	std::string errors;
 
-	std::list<XMLNode*> nodes = cfg->self->getNodes();
-	for (std::list<XMLNode*>::iterator i = nodes.begin(); i != nodes.end(); ++i)
+	std::list<XMLNode> nodes = cfg->self.getNodes();
+	for (std::list<XMLNode>::iterator i = nodes.begin(); i != nodes.end(); ++i)
 	{
-		std::string nodeName = (*i)->getName();
+		std::string nodeName = i->getName();
 
 		if (nodeName == "Option") {
-			nodeName = (*i)->getAttribute("key", "");
+			nodeName = i->getAttribute("key", "");
 			if (object->configCheckData->parsedOptions.find(nodeName) == object->configCheckData->parsedOptions.end()) {
 				if (!errors.empty()) errors += ", ";
 				errors += nodeName;
@@ -147,8 +144,6 @@ bool ConfigStackCheck<T>::stopParsing()
 			}
 		}
 	}
-	for (std::list<XMLNode*>::iterator i = nodes.begin(); i != nodes.end(); ++i)
-		delete (*i);
 	nodes.clear();
 
 	if (!errors.empty()) {
diff --git a/src/CudaBackProjectionAlgorithm3D.cpp b/src/CudaBackProjectionAlgorithm3D.cpp
index abcf096..fbb8f28 100644
--- a/src/CudaBackProjectionAlgorithm3D.cpp
+++ b/src/CudaBackProjectionAlgorithm3D.cpp
@@ -102,9 +102,9 @@ bool CCudaBackProjectionAlgorithm3D::initialize(const Config& _cfg)
 		return false;
 	}
 
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
 	CC.markOptionParsed("GPUindex");
-	m_iVoxelSuperSampling = (int)_cfg.self->getOptionNumerical("VoxelSuperSampling", 1);
+	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1);
 	CC.markOptionParsed("VoxelSuperSampling");
 
 	CFloat32ProjectionData3DMemory* pSinoMem = dynamic_cast<CFloat32ProjectionData3DMemory*>(m_pSinogram);
@@ -114,7 +114,7 @@ const CParallelProjectionGeometry3D* par3dgeom = dynamic_cast<const CParallelPro
 	const CParallelVecProjectionGeometry3D* parvec3dgeom = dynamic_cast<const CParallelVecProjectionGeometry3D*>(projgeom);
 	if (parvec3dgeom || par3dgeom) {
 		// This option is only supported for Par3D currently
-		m_bSIRTWeighting = _cfg.self->getOptionBool("SIRTWeighting", false);
+		m_bSIRTWeighting = _cfg.self.getOptionBool("SIRTWeighting", false);
 		CC.markOptionParsed("SIRTWeighting");
 	}
 
diff --git a/src/CudaCglsAlgorithm3D.cpp b/src/CudaCglsAlgorithm3D.cpp
index a5500d6..3457b81 100644
--- a/src/CudaCglsAlgorithm3D.cpp
+++ b/src/CudaCglsAlgorithm3D.cpp
@@ -106,11 +106,11 @@ bool CCudaCglsAlgorithm3D::initialize(const Config& _cfg)
 		return false;
 	}
 
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
 	CC.markOptionParsed("GPUindex");
-	m_iDetectorSuperSampling = (int)_cfg.self->getOptionNumerical("DetectorSuperSampling", 1);
+	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1);
 	CC.markOptionParsed("DetectorSuperSampling");
-	m_iVoxelSuperSampling = (int)_cfg.self->getOptionNumerical("VoxelSuperSampling", 1);
+	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1);
 	CC.markOptionParsed("VoxelSuperSampling");
 
 	m_pCgls = new AstraCGLS3d();
diff --git a/src/CudaDartMaskAlgorithm.cpp b/src/CudaDartMaskAlgorithm.cpp
index dcdefcc..950b428 100644
--- a/src/CudaDartMaskAlgorithm.cpp
+++ b/src/CudaDartMaskAlgorithm.cpp
@@ -65,38 +65,36 @@ bool CCudaDartMaskAlgorithm::initialize(const Config& _cfg)
 	ConfigStackCheck<CAlgorithm> CC("CudaDartMaskAlgorithm", this, _cfg);
 
 	// reconstruction data
-	XMLNode* node = _cfg.self->getSingleNode("SegmentationDataId");
+	XMLNode node = _cfg.self.getSingleNode("SegmentationDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No SegmentationDataId tag specified.");
-	int id = boost::lexical_cast<int>(node->getContent());
+	int id = boost::lexical_cast<int>(node.getContent());
 	m_pSegmentation = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("SegmentationDataId");
 
 	// reconstruction data
-	node = _cfg.self->getSingleNode("MaskDataId");
+	node = _cfg.self.getSingleNode("MaskDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No MaskDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("MaskDataId");
 
 	// Option: GPU number
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
 	CC.markOptionParsed("GPUindex");
-	if (!_cfg.self->hasOption("GPUindex"))
+	if (!_cfg.self.hasOption("GPUindex"))
 		CC.markOptionParsed("GPUIndex");
 
     // Option: Connectivity
-	m_iConn = (unsigned int)_cfg.self->getOptionNumerical("Connectivity", 8);
+	m_iConn = (unsigned int)_cfg.self.getOptionNumerical("Connectivity", 8);
 	CC.markOptionParsed("Connectivity");
 
 	// Option: Threshold
-	m_iThreshold = (unsigned int)_cfg.self->getOptionNumerical("Threshold", 1);
+	m_iThreshold = (unsigned int)_cfg.self.getOptionNumerical("Threshold", 1);
 	CC.markOptionParsed("Threshold");
 
 	// Option: Radius
-	m_iRadius = (unsigned int)_cfg.self->getOptionNumerical("Radius", 1);
+	m_iRadius = (unsigned int)_cfg.self.getOptionNumerical("Radius", 1);
 	CC.markOptionParsed("Radius");
 
 	_check();
diff --git a/src/CudaDartMaskAlgorithm3D.cpp b/src/CudaDartMaskAlgorithm3D.cpp
index f3500b9..b0dfc5b 100644
--- a/src/CudaDartMaskAlgorithm3D.cpp
+++ b/src/CudaDartMaskAlgorithm3D.cpp
@@ -65,38 +65,36 @@ bool CCudaDartMaskAlgorithm3D::initialize(const Config& _cfg)
 	ConfigStackCheck<CAlgorithm> CC("CudaDartMaskAlgorithm", this, _cfg);
 
 	// reconstruction data
-	XMLNode* node = _cfg.self->getSingleNode("SegmentationDataId");
+	XMLNode node = _cfg.self.getSingleNode("SegmentationDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No SegmentationDataId tag specified.");
-	int id = boost::lexical_cast<int>(node->getContent());
+	int id = boost::lexical_cast<int>(node.getContent());
 	m_pSegmentation = dynamic_cast<CFloat32VolumeData3DMemory*>(CData3DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("SegmentationDataId");
 
 	// reconstruction data
-	node = _cfg.self->getSingleNode("MaskDataId");
+	node = _cfg.self.getSingleNode("MaskDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No MaskDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pMask = dynamic_cast<CFloat32VolumeData3DMemory*>(CData3DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("MaskDataId");
 
 	// Option: GPU number
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
 	CC.markOptionParsed("GPUindex");
-	if (!_cfg.self->hasOption("GPUindex"))
+	if (!_cfg.self.hasOption("GPUindex"))
 		CC.markOptionParsed("GPUIndex");
 
     // Option: Connectivity
-	m_iConn = (unsigned int)_cfg.self->getOptionNumerical("Connectivity", 8);
+	m_iConn = (unsigned int)_cfg.self.getOptionNumerical("Connectivity", 8);
 	CC.markOptionParsed("Connectivity");
 
 	// Option: Threshold
-	m_iThreshold = (unsigned int)_cfg.self->getOptionNumerical("Threshold", 1);
+	m_iThreshold = (unsigned int)_cfg.self.getOptionNumerical("Threshold", 1);
 	CC.markOptionParsed("Threshold");
 
 	// Option: Radius
-	m_iRadius = (unsigned int)_cfg.self->getOptionNumerical("Radius", 1);
+	m_iRadius = (unsigned int)_cfg.self.getOptionNumerical("Radius", 1);
 	CC.markOptionParsed("Radius");
 
 	_check();
diff --git a/src/CudaDartSmoothingAlgorithm.cpp b/src/CudaDartSmoothingAlgorithm.cpp
index 2f2103f..7e22809 100644
--- a/src/CudaDartSmoothingAlgorithm.cpp
+++ b/src/CudaDartSmoothingAlgorithm.cpp
@@ -65,34 +65,32 @@ bool CCudaDartSmoothingAlgorithm::initialize(const Config& _cfg)
 	ConfigStackCheck<CAlgorithm> CC("CudaDartSmoothingAlgorithm", this, _cfg);
 
 	// reconstruction data
-	XMLNode* node = _cfg.self->getSingleNode("InDataId");
+	XMLNode node = _cfg.self.getSingleNode("InDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No InDataId tag specified.");
-	int id = boost::lexical_cast<int>(node->getContent());
+	int id = boost::lexical_cast<int>(node.getContent());
 	m_pIn = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("InDataId");
 
 	// reconstruction data
-	node = _cfg.self->getSingleNode("OutDataId");
+	node = _cfg.self.getSingleNode("OutDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No OutDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pOut = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("OutDataId");
 
 	// Option: GPU number
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
 	CC.markOptionParsed("GPUindex");
-	if (!_cfg.self->hasOption("GPUindex"))
+	if (!_cfg.self.hasOption("GPUindex"))
 		CC.markOptionParsed("GPUIndex");
 
 	// Option: Radius
-	m_fB = (float)_cfg.self->getOptionNumerical("Intensity", 0.3f);
+	m_fB = (float)_cfg.self.getOptionNumerical("Intensity", 0.3f);
 	CC.markOptionParsed("Intensity");
 
 	// Option: Radius
-	m_iRadius = (unsigned int)_cfg.self->getOptionNumerical("Radius", 1);
+	m_iRadius = (unsigned int)_cfg.self.getOptionNumerical("Radius", 1);
 	CC.markOptionParsed("Radius");
 
 
diff --git a/src/CudaDartSmoothingAlgorithm3D.cpp b/src/CudaDartSmoothingAlgorithm3D.cpp
index f3cf015..9c4437a 100644
--- a/src/CudaDartSmoothingAlgorithm3D.cpp
+++ b/src/CudaDartSmoothingAlgorithm3D.cpp
@@ -65,34 +65,32 @@ bool CCudaDartSmoothingAlgorithm3D::initialize(const Config& _cfg)
 	ConfigStackCheck<CAlgorithm> CC("CudaDartSmoothingAlgorithm", this, _cfg);
 
 	// reconstruction data
-	XMLNode* node = _cfg.self->getSingleNode("InDataId");
+	XMLNode node = _cfg.self.getSingleNode("InDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No InDataId tag specified.");
-	int id = boost::lexical_cast<int>(node->getContent());
+	int id = boost::lexical_cast<int>(node.getContent());
 	m_pIn = dynamic_cast<CFloat32VolumeData3DMemory*>(CData3DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("InDataId");
 
 	// reconstruction data
-	node = _cfg.self->getSingleNode("OutDataId");
+	node = _cfg.self.getSingleNode("OutDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaDartMask", "No OutDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pOut = dynamic_cast<CFloat32VolumeData3DMemory*>(CData3DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("OutDataId");
 
 	// Option: GPU number
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
 	CC.markOptionParsed("GPUindex");
-	if (!_cfg.self->hasOption("GPUindex"))
+	if (!_cfg.self.hasOption("GPUindex"))
 		CC.markOptionParsed("GPUIndex");
 
 	// Option: Intensity
-	m_fB = (float)_cfg.self->getOptionNumerical("Intensity", 0.3f);
+	m_fB = (float)_cfg.self.getOptionNumerical("Intensity", 0.3f);
 	CC.markOptionParsed("Intensity");
 
 	// Option: Radius
-	m_iRadius = (unsigned int)_cfg.self->getOptionNumerical("Radius", 1);
+	m_iRadius = (unsigned int)_cfg.self.getOptionNumerical("Radius", 1);
 	CC.markOptionParsed("Radius");
 
 	_check();
diff --git a/src/CudaDataOperationAlgorithm.cpp b/src/CudaDataOperationAlgorithm.cpp
index 79a9d7f..ae133c2 100644
--- a/src/CudaDataOperationAlgorithm.cpp
+++ b/src/CudaDataOperationAlgorithm.cpp
@@ -67,40 +67,37 @@ bool CCudaDataOperationAlgorithm::initialize(const Config& _cfg)
 	ConfigStackCheck<CAlgorithm> CC("CCudaDataOperationAlgorithm", this, _cfg);
 
 	// operation
-	XMLNode* node = _cfg.self->getSingleNode("Operation");
+	XMLNode node = _cfg.self.getSingleNode("Operation");
 	ASTRA_CONFIG_CHECK(node, "CCudaDataOperationAlgorithm", "No Operation tag specified.");
-	m_sOperation = node->getContent();
+	m_sOperation = node.getContent();
 	m_sOperation.erase(std::remove(m_sOperation.begin(), m_sOperation.end(), ' '), m_sOperation.end());
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("Operation");
 
 	// data
-	node = _cfg.self->getSingleNode("DataId");
+	node = _cfg.self.getSingleNode("DataId");
 	ASTRA_CONFIG_CHECK(node, "CCudaDataOperationAlgorithm", "No DataId tag specified.");
-	vector<string> data = node->getContentArray();
+	vector<string> data = node.getContentArray();
 	for (vector<string>::iterator it = data.begin(); it != data.end(); it++){
 		int id = boost::lexical_cast<int>(*it);
 		m_pData.push_back(dynamic_cast<CFloat32Data2D*>(CData2DManager::getSingleton().get(id)));
 	}
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("DataId");
 
 	// scalar
-	node = _cfg.self->getSingleNode("Scalar");
+	node = _cfg.self.getSingleNode("Scalar");
 	ASTRA_CONFIG_CHECK(node, "CCudaDataOperationAlgorithm", "No Scalar tag specified.");
-	m_fScalar = node->getContentNumericalArray();
-	ASTRA_DELETE(node);
+	m_fScalar = node.getContentNumericalArray();
 	CC.markNodeParsed("Scalar");
 
 	// Option: GPU number
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
 	CC.markOptionParsed("GPUindex");
-	if (!_cfg.self->hasOption("GPUindex"))
+	if (!_cfg.self.hasOption("GPUindex"))
 		CC.markOptionParsed("GPUIndex");
 
-	if (_cfg.self->hasOption("MaskId")) {
-		int id = boost::lexical_cast<int>(_cfg.self->getOption("MaskId"));
+	if (_cfg.self.hasOption("MaskId")) {
+		int id = boost::lexical_cast<int>(_cfg.self.getOption("MaskId"));
 		m_pMask = dynamic_cast<CFloat32Data2D*>(CData2DManager::getSingleton().get(id));
 	}
 	CC.markOptionParsed("MaskId");
diff --git a/src/CudaFDKAlgorithm3D.cpp b/src/CudaFDKAlgorithm3D.cpp
index 7638696..467e641 100644
--- a/src/CudaFDKAlgorithm3D.cpp
+++ b/src/CudaFDKAlgorithm3D.cpp
@@ -100,12 +100,12 @@ bool CCudaFDKAlgorithm3D::initialize(const Config& _cfg)
 		return false;
 	}
 
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
 	CC.markOptionParsed("GPUindex");
-	m_iVoxelSuperSampling = (int)_cfg.self->getOptionNumerical("VoxelSuperSampling", 1);
+	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1);
 	CC.markOptionParsed("VoxelSuperSampling");
 
-	m_bShortScan = _cfg.self->getOptionBool("ShortScan", false);
+	m_bShortScan = _cfg.self.getOptionBool("ShortScan", false);
 	CC.markOptionParsed("ShortScan");
 
 	// success
diff --git a/src/CudaFilteredBackProjectionAlgorithm.cpp b/src/CudaFilteredBackProjectionAlgorithm.cpp
index 0badc20..5d6c166 100644
--- a/src/CudaFilteredBackProjectionAlgorithm.cpp
+++ b/src/CudaFilteredBackProjectionAlgorithm.cpp
@@ -78,39 +78,36 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)
 	}
 
 	// sinogram data
-	XMLNode* node = _cfg.self->getSingleNode("ProjectionDataId");
+	XMLNode node = _cfg.self.getSingleNode("ProjectionDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaFBP", "No ProjectionDataId tag specified.");
-	int id = boost::lexical_cast<int>(node->getContent());
+	int id = boost::lexical_cast<int>(node.getContent());
 	m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("ProjectionDataId");
 
 	// reconstruction data
-	node = _cfg.self->getSingleNode("ReconstructionDataId");
+	node = _cfg.self.getSingleNode("ReconstructionDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaFBP", "No ReconstructionDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pReconstruction = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("ReconstructionDataId");
 
 	// filter type
-	node = _cfg.self->getSingleNode("FilterType");
-	if(node != NULL)
+	node = _cfg.self.getSingleNode("FilterType");
+	if (node)
 	{
-		m_eFilter = _convertStringToFilter(node->getContent().c_str());
+		m_eFilter = _convertStringToFilter(node.getContent().c_str());
 	}
 	else
 	{
 		m_eFilter = FILTER_RAMLAK;
 	}
 	CC.markNodeParsed("FilterType");
-	ASTRA_DELETE(node);
 
 	// filter
-	node = _cfg.self->getSingleNode("FilterSinogramId");
-	if(node != NULL)
+	node = _cfg.self.getSingleNode("FilterSinogramId");
+	if (node)
 	{
-		id = boost::lexical_cast<int>(node->getContent());
+		id = boost::lexical_cast<int>(node.getContent());
 		const CFloat32ProjectionData2D * pFilterData = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
 		m_iFilterWidth = pFilterData->getGeometry()->getDetectorCount();
 		int iFilterProjectionCount = pFilterData->getGeometry()->getProjectionAngleCount();
@@ -124,13 +121,12 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)
 		m_pfFilter = NULL;
 	}
 	CC.markNodeParsed("FilterSinogramId"); // TODO: Only for some types!
-	ASTRA_DELETE(node);
 
 	// filter parameter
-	node = _cfg.self->getSingleNode("FilterParameter");
-	if(node != NULL)
+	node = _cfg.self.getSingleNode("FilterParameter");
+	if (node)
 	{
-		float fParameter = boost::lexical_cast<float>(node->getContent());
+		float fParameter = boost::lexical_cast<float>(node.getContent());
 		m_fFilterParameter = fParameter;
 	}
 	else
@@ -138,13 +134,12 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)
 		m_fFilterParameter = -1.0f;
 	}
 	CC.markNodeParsed("FilterParameter"); // TODO: Only for some types!
-	ASTRA_DELETE(node);
 
 	// D value
-	node = _cfg.self->getSingleNode("FilterD");
-	if(node != NULL)
+	node = _cfg.self.getSingleNode("FilterD");
+	if (node)
 	{
-		float fD = boost::lexical_cast<float>(node->getContent());
+		float fD = boost::lexical_cast<float>(node.getContent());
 		m_fFilterD = fD;
 	}
 	else
@@ -152,19 +147,18 @@ bool CCudaFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)
 		m_fFilterD = 1.0f;
 	}
 	CC.markNodeParsed("FilterD"); // TODO: Only for some types!
-	ASTRA_DELETE(node);
 
 	// GPU number
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
 	CC.markOptionParsed("GPUindex");
 
 	// Pixel supersampling factor
-	m_iPixelSuperSampling = (int)_cfg.self->getOptionNumerical("PixelSuperSampling", 1);
+	m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", 1);
 	CC.markOptionParsed("PixelSuperSampling");
 
 	// Fan beam short scan mode
 	if (m_pSinogram && dynamic_cast<CFanFlatProjectionGeometry2D*>(m_pSinogram->getGeometry())) {
-		m_bShortScan = (int)_cfg.self->getOptionBool("ShortScan", false);
+		m_bShortScan = (int)_cfg.self.getOptionBool("ShortScan", false);
 		CC.markOptionParsed("ShortScan");
 	}
 
diff --git a/src/CudaForwardProjectionAlgorithm.cpp b/src/CudaForwardProjectionAlgorithm.cpp
index 95abb62..0f97d59 100644
--- a/src/CudaForwardProjectionAlgorithm.cpp
+++ b/src/CudaForwardProjectionAlgorithm.cpp
@@ -73,42 +73,39 @@ bool CCudaForwardProjectionAlgorithm::initialize(const Config& _cfg)
 	ConfigStackCheck<CAlgorithm> CC("CudaForwardProjectionAlgorithm", this, _cfg);
 	
 	// sinogram data
-	XMLNode* node = _cfg.self->getSingleNode("ProjectionDataId");
+	XMLNode node = _cfg.self.getSingleNode("ProjectionDataId");
 	ASTRA_CONFIG_CHECK(node, "FP_CUDA", "No ProjectionDataId tag specified.");
-	int id = boost::lexical_cast<int>(node->getContent());
+	int id = boost::lexical_cast<int>(node.getContent());
 	m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("ProjectionDataId");
 
 	// volume data
-	node = _cfg.self->getSingleNode("VolumeDataId");
+	node = _cfg.self.getSingleNode("VolumeDataId");
 	ASTRA_CONFIG_CHECK(node, "FP_CUDA", "No VolumeDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pVolume = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("VolumeDataId");
 
 	// GPU number
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
 	CC.markOptionParsed("GPUindex");
-	if (!_cfg.self->hasOption("GPUindex"))
+	if (!_cfg.self.hasOption("GPUindex"))
 		CC.markOptionParsed("GPUIndex");
 
 	// Detector supersampling factor
-	m_iDetectorSuperSampling = (int)_cfg.self->getOptionNumerical("DetectorSuperSampling", 1);
+	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1);
 	CC.markOptionParsed("DetectorSuperSampling");
 
 
 	// This isn't used yet, but passing it is not something to warn about
-	node = _cfg.self->getSingleNode("ProjectorId");
+	node = _cfg.self.getSingleNode("ProjectorId");
 	if (node) {
-		id = boost::lexical_cast<int>(node->getContent());
+		id = boost::lexical_cast<int>(node.getContent());
 		CProjector2D *projector = CProjector2DManager::getSingleton().get(id);
 		if (!dynamic_cast<CCudaProjector2D*>(projector)) {
 			ASTRA_WARN("non-CUDA Projector2D passed to FP_CUDA");
 		}
-		delete node;
 	}
 	CC.markNodeParsed("ProjectorId");
 	
diff --git a/src/CudaForwardProjectionAlgorithm3D.cpp b/src/CudaForwardProjectionAlgorithm3D.cpp
index 8e6bab5..e29b5a9 100644
--- a/src/CudaForwardProjectionAlgorithm3D.cpp
+++ b/src/CudaForwardProjectionAlgorithm3D.cpp
@@ -78,40 +78,37 @@ bool CCudaForwardProjectionAlgorithm3D::initialize(const Config& _cfg)
 	ASTRA_ASSERT(_cfg.self);
 	ConfigStackCheck<CAlgorithm> CC("CudaForwardProjectionAlgorithm3D", this, _cfg);	
 
-	XMLNode* node;
+	XMLNode node;
 	int id;
 
 	// sinogram data
-	node = _cfg.self->getSingleNode("ProjectionDataId");
+	node = _cfg.self.getSingleNode("ProjectionDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaForwardProjection3D", "No ProjectionDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pProjections = dynamic_cast<CFloat32ProjectionData3DMemory*>(CData3DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("ProjectionDataId");
 
 	// reconstruction data
-	node = _cfg.self->getSingleNode("VolumeDataId");
+	node = _cfg.self.getSingleNode("VolumeDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaForwardProjection3D", "No VolumeDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pVolume = dynamic_cast<CFloat32VolumeData3DMemory*>(CData3DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("VolumeDataId");
 
 	// optional: projector
-	node = _cfg.self->getSingleNode("ProjectorId");
+	node = _cfg.self.getSingleNode("ProjectorId");
 	if (node) {
-		id = boost::lexical_cast<int>(node->getContent());
+		id = boost::lexical_cast<int>(node.getContent());
 		m_pProjector = CProjector3DManager::getSingleton().get(id);
-		ASTRA_DELETE(node);
 	} else {
 		m_pProjector = 0; // TODO: or manually construct default projector?
 	}
 	CC.markNodeParsed("ProjectorId");
 
 	// GPU number
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
 	CC.markOptionParsed("GPUindex");
-	m_iDetectorSuperSampling = (int)_cfg.self->getOptionNumerical("DetectorSuperSampling", 1);
+	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1);
 	CC.markOptionParsed("DetectorSuperSampling");
 
 	// success
diff --git a/src/CudaProjector2D.cpp b/src/CudaProjector2D.cpp
index 056ea3b..fa024c8 100644
--- a/src/CudaProjector2D.cpp
+++ b/src/CudaProjector2D.cpp
@@ -104,10 +104,10 @@ bool CCudaProjector2D::initialize(const Config& _cfg)
 
 	// TODO: Check the projection geometry is a supported type
 
-	XMLNode* node = _cfg.self->getSingleNode("ProjectionKernel");
+	XMLNode node = _cfg.self.getSingleNode("ProjectionKernel");
 	m_projectionKernel = ker2d_default;
 	if (node) {
-		std::string sProjKernel = node->getContent();
+		std::string sProjKernel = node.getContent();
 
 		if (sProjKernel == "default") {
 
@@ -115,7 +115,6 @@ bool CCudaProjector2D::initialize(const Config& _cfg)
 			return false;
 		}
 	}
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("ProjectionKernel");
 
 	m_bIsInitialized = _check();
diff --git a/src/CudaProjector3D.cpp b/src/CudaProjector3D.cpp
index 2f4c799..41529a5 100644
--- a/src/CudaProjector3D.cpp
+++ b/src/CudaProjector3D.cpp
@@ -105,10 +105,10 @@ bool CCudaProjector3D::initialize(const Config& _cfg)
 		return false;
 	}
 
-	XMLNode* node = _cfg.self->getSingleNode("ProjectionKernel");
+	XMLNode node = _cfg.self.getSingleNode("ProjectionKernel");
 	m_projectionKernel = ker3d_default;
 	if (node) {
-		std::string sProjKernel = node->getContent();
+		std::string sProjKernel = node.getContent();
 
 		if (sProjKernel == "default") {
 
@@ -118,7 +118,6 @@ bool CCudaProjector3D::initialize(const Config& _cfg)
 			return false;
 		}
 	}
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("ProjectionKernel");
 
 	m_bIsInitialized = _check();
diff --git a/src/CudaReconstructionAlgorithm2D.cpp b/src/CudaReconstructionAlgorithm2D.cpp
index 1c6b763..db99d42 100644
--- a/src/CudaReconstructionAlgorithm2D.cpp
+++ b/src/CudaReconstructionAlgorithm2D.cpp
@@ -96,91 +96,88 @@ bool CCudaReconstructionAlgorithm2D::initialize(const Config& _cfg)
 	}
 
 	// sinogram data
-	XMLNode* node = _cfg.self->getSingleNode("ProjectionDataId");
+	XMLNode node = _cfg.self.getSingleNode("ProjectionDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaSirt2", "No ProjectionDataId tag specified.");
-	int id = boost::lexical_cast<int>(node->getContent());
+	int id = boost::lexical_cast<int>(node.getContent());
 	m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("ProjectionDataId");
 
 	// reconstruction data
-	node = _cfg.self->getSingleNode("ReconstructionDataId");
+	node = _cfg.self.getSingleNode("ReconstructionDataId");
 	ASTRA_CONFIG_CHECK(node, "CudaSirt2", "No ReconstructionDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pReconstruction = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("ReconstructionDataId");
 
 	// fixed mask
-	if (_cfg.self->hasOption("ReconstructionMaskId")) {
+	if (_cfg.self.hasOption("ReconstructionMaskId")) {
 		m_bUseReconstructionMask = true;
-		id = boost::lexical_cast<int>(_cfg.self->getOption("ReconstructionMaskId"));
+		id = boost::lexical_cast<int>(_cfg.self.getOption("ReconstructionMaskId"));
 		m_pReconstructionMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
 		ASTRA_CONFIG_CHECK(m_pReconstructionMask, "CudaReconstruction2D", "Invalid ReconstructionMaskId.");
 	}
 	CC.markOptionParsed("ReconstructionMaskId");
 	// fixed mask
-	if (_cfg.self->hasOption("SinogramMaskId")) {
+	if (_cfg.self.hasOption("SinogramMaskId")) {
 		m_bUseSinogramMask = true;
-		id = boost::lexical_cast<int>(_cfg.self->getOption("SinogramMaskId"));
+		id = boost::lexical_cast<int>(_cfg.self.getOption("SinogramMaskId"));
 		m_pSinogramMask = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
 		ASTRA_CONFIG_CHECK(m_pSinogramMask, "CudaReconstruction2D", "Invalid SinogramMaskId.");
 	}
 	CC.markOptionParsed("SinogramMaskId");
 
 	// Constraints - NEW
-	if (_cfg.self->hasOption("MinConstraint")) {
+	if (_cfg.self.hasOption("MinConstraint")) {
 		m_bUseMinConstraint = true;
-		m_fMinValue = _cfg.self->getOptionNumerical("MinConstraint", 0.0f);
+		m_fMinValue = _cfg.self.getOptionNumerical("MinConstraint", 0.0f);
 		CC.markOptionParsed("MinConstraint");
 	} else {
 		// Constraint - OLD
-		m_bUseMinConstraint = _cfg.self->getOptionBool("UseMinConstraint", false);
+		m_bUseMinConstraint = _cfg.self.getOptionBool("UseMinConstraint", false);
 		CC.markOptionParsed("UseMinConstraint");
 		if (m_bUseMinConstraint) {
-			m_fMinValue = _cfg.self->getOptionNumerical("MinConstraintValue", 0.0f);
+			m_fMinValue = _cfg.self.getOptionNumerical("MinConstraintValue", 0.0f);
 			CC.markOptionParsed("MinConstraintValue");
 		}
 	}
-	if (_cfg.self->hasOption("MaxConstraint")) {
+	if (_cfg.self.hasOption("MaxConstraint")) {
 		m_bUseMaxConstraint = true;
-		m_fMaxValue = _cfg.self->getOptionNumerical("MaxConstraint", 255.0f);
+		m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraint", 255.0f);
 		CC.markOptionParsed("MaxConstraint");
 	} else {
 		// Constraint - OLD
-		m_bUseMaxConstraint = _cfg.self->getOptionBool("UseMaxConstraint", false);
+		m_bUseMaxConstraint = _cfg.self.getOptionBool("UseMaxConstraint", false);
 		CC.markOptionParsed("UseMaxConstraint");
 		if (m_bUseMaxConstraint) {
-			m_fMaxValue = _cfg.self->getOptionNumerical("MaxConstraintValue", 0.0f);
+			m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraintValue", 0.0f);
 			CC.markOptionParsed("MaxConstraintValue");
 		}
 	}
 
 	// GPU number
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
 	CC.markOptionParsed("GPUindex");
-	if (!_cfg.self->hasOption("GPUindex"))
+	if (!_cfg.self.hasOption("GPUindex"))
 		CC.markOptionParsed("GPUIndex");
 
 	// Detector supersampling factor
-	m_iDetectorSuperSampling = (int)_cfg.self->getOptionNumerical("DetectorSuperSampling", 1);
+	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1);
 	CC.markOptionParsed("DetectorSuperSampling");
 
 	// Pixel supersampling factor
-	m_iPixelSuperSampling = (int)_cfg.self->getOptionNumerical("PixelSuperSampling", 1);
+	m_iPixelSuperSampling = (int)_cfg.self.getOptionNumerical("PixelSuperSampling", 1);
 	CC.markOptionParsed("PixelSuperSampling");
 
 
 	// This isn't used yet, but passing it is not something to warn about
-	node = _cfg.self->getSingleNode("ProjectorId");
+	node = _cfg.self.getSingleNode("ProjectorId");
 	if (node) {
-		id = boost::lexical_cast<int>(node->getContent());
+		id = boost::lexical_cast<int>(node.getContent());
 		CProjector2D *projector = CProjector2DManager::getSingleton().get(id);
 		if (!dynamic_cast<CCudaProjector2D*>(projector)) {
 			ASTRA_WARN("non-CUDA Projector2D passed");
 		}
-		delete node;
 	}
 	CC.markNodeParsed("ProjectorId");
 
diff --git a/src/CudaRoiSelectAlgorithm.cpp b/src/CudaRoiSelectAlgorithm.cpp
index bfccb3a..7635c69 100644
--- a/src/CudaRoiSelectAlgorithm.cpp
+++ b/src/CudaRoiSelectAlgorithm.cpp
@@ -66,22 +66,21 @@ bool CCudaRoiSelectAlgorithm::initialize(const Config& _cfg)
 	ConfigStackCheck<CAlgorithm> CC("CudaDartMaskAlgorithm", this, _cfg);
 
 	// reconstruction data
-	XMLNode* node = _cfg.self->getSingleNode("DataId");
+	XMLNode node = _cfg.self.getSingleNode("DataId");
 	ASTRA_CONFIG_CHECK(node, "CudaRoiSelect", "No DataId tag specified.");
-	int id = boost::lexical_cast<int>(node->getContent());
+	int id = boost::lexical_cast<int>(node.getContent());
 	m_pData = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("DataId");
 
 	// Option: GPU number
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUIndex", m_iGPUIndex);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUIndex", m_iGPUIndex);
 	CC.markOptionParsed("GPUindex");
-	if (!_cfg.self->hasOption("GPUindex"))
+	if (!_cfg.self.hasOption("GPUindex"))
 		CC.markOptionParsed("GPUIndex");
 
 	// Option: Radius
-	m_fRadius = (unsigned int)_cfg.self->getOptionNumerical("Radius", 0.0f);
+	m_fRadius = (unsigned int)_cfg.self.getOptionNumerical("Radius", 0.0f);
 	CC.markOptionParsed("Radius");
 
 	_check();
diff --git a/src/CudaSartAlgorithm.cpp b/src/CudaSartAlgorithm.cpp
index 8e22c59..8c0c6d7 100644
--- a/src/CudaSartAlgorithm.cpp
+++ b/src/CudaSartAlgorithm.cpp
@@ -74,7 +74,7 @@ bool CCudaSartAlgorithm::initialize(const Config& _cfg)
 	// projection order
 	int projectionCount = m_pSinogram->getGeometry()->getProjectionAngleCount();
 	int* projectionOrder = NULL;
-	string projOrder = _cfg.self->getOption("ProjectionOrder", "random");
+	string projOrder = _cfg.self.getOption("ProjectionOrder", "random");
 	CC.markOptionParsed("ProjectionOrder");
 	if (projOrder == "sequential") {
 		projectionOrder = new int[projectionCount];
@@ -97,7 +97,7 @@ bool CCudaSartAlgorithm::initialize(const Config& _cfg)
 		sart->setProjectionOrder(projectionOrder, projectionCount);
 		delete[] projectionOrder;
 	} else if (projOrder == "custom") {
-		vector<float32> projOrderList = _cfg.self->getOptionNumericalArray("ProjectionOrderList");
+		vector<float32> projOrderList = _cfg.self.getOptionNumericalArray("ProjectionOrderList");
 		projectionOrder = new int[projOrderList.size()];
 		for (int i = 0; i < projOrderList.size(); i++) {
 			projectionOrder[i] = static_cast<int>(projOrderList[i]);
diff --git a/src/CudaSirtAlgorithm.cpp b/src/CudaSirtAlgorithm.cpp
index f6eb79a..d424915 100644
--- a/src/CudaSirtAlgorithm.cpp
+++ b/src/CudaSirtAlgorithm.cpp
@@ -76,13 +76,13 @@ bool CCudaSirtAlgorithm::initialize(const Config& _cfg)
 		return false;
 
 	// min/max masks
-	if (_cfg.self->hasOption("MinMaskId")) {
-		int id = boost::lexical_cast<int>(_cfg.self->getOption("MinMaskId"));
+	if (_cfg.self.hasOption("MinMaskId")) {
+		int id = boost::lexical_cast<int>(_cfg.self.getOption("MinMaskId"));
 		m_pMinMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
 	}
 	CC.markOptionParsed("MinMaskId");
-	if (_cfg.self->hasOption("MaxMaskId")) {
-		int id = boost::lexical_cast<int>(_cfg.self->getOption("MaxMaskId"));
+	if (_cfg.self.hasOption("MaxMaskId")) {
+		int id = boost::lexical_cast<int>(_cfg.self.getOption("MaxMaskId"));
 		m_pMaxMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
 	}
 	CC.markOptionParsed("MaxMaskId");
diff --git a/src/CudaSirtAlgorithm3D.cpp b/src/CudaSirtAlgorithm3D.cpp
index da83c7e..5ad131b 100644
--- a/src/CudaSirtAlgorithm3D.cpp
+++ b/src/CudaSirtAlgorithm3D.cpp
@@ -107,11 +107,11 @@ bool CCudaSirtAlgorithm3D::initialize(const Config& _cfg)
 		return false;
 	}
 
-	m_iGPUIndex = (int)_cfg.self->getOptionNumerical("GPUindex", -1);
+	m_iGPUIndex = (int)_cfg.self.getOptionNumerical("GPUindex", -1);
 	CC.markOptionParsed("GPUindex");
-	m_iDetectorSuperSampling = (int)_cfg.self->getOptionNumerical("DetectorSuperSampling", 1);
+	m_iDetectorSuperSampling = (int)_cfg.self.getOptionNumerical("DetectorSuperSampling", 1);
 	CC.markOptionParsed("DetectorSuperSampling");
-	m_iVoxelSuperSampling = (int)_cfg.self->getOptionNumerical("VoxelSuperSampling", 1);
+	m_iVoxelSuperSampling = (int)_cfg.self.getOptionNumerical("VoxelSuperSampling", 1);
 	CC.markOptionParsed("VoxelSuperSampling");
 
 	m_pSirt = new AstraSIRT3d();
diff --git a/src/FanFlatProjectionGeometry2D.cpp b/src/FanFlatProjectionGeometry2D.cpp
index d757f18..32a19bc 100644
--- a/src/FanFlatProjectionGeometry2D.cpp
+++ b/src/FanFlatProjectionGeometry2D.cpp
@@ -134,17 +134,15 @@ bool CFanFlatProjectionGeometry2D::initialize(const Config& _cfg)
 	CProjectionGeometry2D::initialize(_cfg);
 
 	// Required: DistanceOriginDetector
-	XMLNode* node = _cfg.self->getSingleNode("DistanceOriginDetector");
+	XMLNode node = _cfg.self.getSingleNode("DistanceOriginDetector");
 	ASTRA_CONFIG_CHECK(node, "FanFlatProjectionGeometry2D", "No DistanceOriginDetector tag specified.");
-	m_fOriginDetectorDistance = boost::lexical_cast<float32>(node->getContent());
-	ASTRA_DELETE(node);
+	m_fOriginDetectorDistance = boost::lexical_cast<float32>(node.getContent());
 	CC.markNodeParsed("DistanceOriginDetector");
 
 	// Required: DetectorOriginSource
-	node = _cfg.self->getSingleNode("DistanceOriginSource");
+	node = _cfg.self.getSingleNode("DistanceOriginSource");
 	ASTRA_CONFIG_CHECK(node, "FanFlatProjectionGeometry2D", "No DistanceOriginSource tag specified.");
-	m_fOriginSourceDistance = boost::lexical_cast<float32>(node->getContent());
-	ASTRA_DELETE(node);
+	m_fOriginSourceDistance = boost::lexical_cast<float32>(node.getContent());
 	CC.markNodeParsed("DistanceOriginSource");
 
 	// success
@@ -209,12 +207,12 @@ Config* CFanFlatProjectionGeometry2D::getConfiguration() const
 {
 	Config* cfg = new Config();
 	cfg->initialize("ProjectionGeometry2D");
-	cfg->self->addAttribute("type", "fanflat");
-	cfg->self->addChildNode("DetectorCount", getDetectorCount());
-	cfg->self->addChildNode("DetectorWidth", getDetectorWidth());
-	cfg->self->addChildNode("DistanceOriginSource", getOriginSourceDistance());
-	cfg->self->addChildNode("DistanceOriginDetector", getOriginDetectorDistance());
-	cfg->self->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
+	cfg->self.addAttribute("type", "fanflat");
+	cfg->self.addChildNode("DetectorCount", getDetectorCount());
+	cfg->self.addChildNode("DetectorWidth", getDetectorWidth());
+	cfg->self.addChildNode("DistanceOriginSource", getOriginSourceDistance());
+	cfg->self.addChildNode("DistanceOriginDetector", getOriginDetectorDistance());
+	cfg->self.addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
 	return cfg;
 }
 //----------------------------------------------------------------------------------------
diff --git a/src/FanFlatVecProjectionGeometry2D.cpp b/src/FanFlatVecProjectionGeometry2D.cpp
index 9c7b596..4104379 100644
--- a/src/FanFlatVecProjectionGeometry2D.cpp
+++ b/src/FanFlatVecProjectionGeometry2D.cpp
@@ -116,25 +116,23 @@ bool CFanFlatVecProjectionGeometry2D::initialize(const Config& _cfg)
 	ASTRA_ASSERT(_cfg.self);
 	ConfigStackCheck<CProjectionGeometry2D> CC("FanFlatVecProjectionGeometry2D", this, _cfg);	
 
-	XMLNode* node;
+	XMLNode node;
 
 	// TODO: Fix up class hierarchy... this class doesn't fit very well.
 	// initialization of parent class
 	//CProjectionGeometry2D::initialize(_cfg);
 
 	// Required: DetectorCount
-	node = _cfg.self->getSingleNode("DetectorCount");
+	node = _cfg.self.getSingleNode("DetectorCount");
 	ASTRA_CONFIG_CHECK(node, "FanFlatVecProjectionGeometry3D", "No DetectorRowCount tag specified.");
-	m_iDetectorCount = boost::lexical_cast<int>(node->getContent());
-	ASTRA_DELETE(node);
+	m_iDetectorCount = boost::lexical_cast<int>(node.getContent());
 	CC.markNodeParsed("DetectorCount");
 
 	// Required: Vectors
-	node = _cfg.self->getSingleNode("Vectors");
+	node = _cfg.self.getSingleNode("Vectors");
 	ASTRA_CONFIG_CHECK(node, "FanFlatVecProjectionGeometry3D", "No Vectors tag specified.");
-	vector<float32> data = node->getContentNumericalArray();
+	vector<float32> data = node.getContentNumericalArray();
 	CC.markNodeParsed("Vectors");
-	ASTRA_DELETE(node);
 	ASTRA_CONFIG_CHECK(data.size() % 6 == 0, "FanFlatVecProjectionGeometry3D", "Vectors doesn't consist of 6-tuples.");
 	m_iProjectionAngleCount = data.size() / 6;
 	m_pProjectionAngles = new SFanProjection[m_iProjectionAngleCount];
@@ -232,8 +230,8 @@ Config* CFanFlatVecProjectionGeometry2D::getConfiguration() const
 {
 	Config* cfg = new Config();
 	cfg->initialize("ProjectionGeometry2D");
-	cfg->self->addAttribute("type", "fanflat_vec");
-	cfg->self->addChildNode("DetectorCount", getDetectorCount());
+	cfg->self.addAttribute("type", "fanflat_vec");
+	cfg->self.addChildNode("DetectorCount", getDetectorCount());
 	std::string vectors = "";
 	for (int i = 0; i < m_iProjectionAngleCount; ++i) {
 		SFanProjection& p = m_pProjectionAngles[i];
@@ -245,7 +243,7 @@ Config* CFanFlatVecProjectionGeometry2D::getConfiguration() const
 		vectors += boost::lexical_cast<string>(p.fDetUY);
 		if (i < m_iProjectionAngleCount-1) vectors += ';';
 	}
-	cfg->self->addChildNode("Vectors", vectors);
+	cfg->self.addChildNode("Vectors", vectors);
 	return cfg;
 }
 //----------------------------------------------------------------------------------------
diff --git a/src/FilteredBackProjectionAlgorithm.cpp b/src/FilteredBackProjectionAlgorithm.cpp
index 4a8e5ac..f494d22 100644
--- a/src/FilteredBackProjectionAlgorithm.cpp
+++ b/src/FilteredBackProjectionAlgorithm.cpp
@@ -94,30 +94,27 @@ bool CFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)
 	ASTRA_ASSERT(_cfg.self);
 	
 	// projector
-	XMLNode* node = _cfg.self->getSingleNode("ProjectorId");
+	XMLNode node = _cfg.self.getSingleNode("ProjectorId");
 	ASTRA_CONFIG_CHECK(node, "FilteredBackProjection", "No ProjectorId tag specified.");
-	int id = boost::lexical_cast<int>(node->getContent());
+	int id = boost::lexical_cast<int>(node.getContent());
 	m_pProjector = CProjector2DManager::getSingleton().get(id);
-	ASTRA_DELETE(node);
 
 	// sinogram data
-	node = _cfg.self->getSingleNode("ProjectionDataId");
+	node = _cfg.self.getSingleNode("ProjectionDataId");
 	ASTRA_CONFIG_CHECK(node, "FilteredBackProjection", "No ProjectionDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 
 	// volume data
-	node = _cfg.self->getSingleNode("ReconstructionDataId");
+	node = _cfg.self.getSingleNode("ReconstructionDataId");
 	ASTRA_CONFIG_CHECK(node, "FilteredBackProjection", "No ReconstructionDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pReconstruction = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 
-	node = _cfg.self->getSingleNode("ProjectionIndex");
+	node = _cfg.self.getSingleNode("ProjectionIndex");
 	if (node) 
 	{
-		vector<float32> projectionIndex = node->getContentNumericalArray();
+		vector<float32> projectionIndex = node.getContentNumericalArray();
 
 		int angleCount = projectionIndex.size();
 		int detectorCount = m_pProjector->getProjectionGeometry()->getDetectorCount();
@@ -154,7 +151,6 @@ bool CFilteredBackProjectionAlgorithm::initialize(const Config& _cfg)
 		m_pProjector = new CParallelBeamLineKernelProjector2D(pg,m_pReconstruction->getGeometry());
 		m_pSinogram = new CFloat32ProjectionData2D(pg, sinogramData2D);
 	}
-	ASTRA_DELETE(node);
 
 	// TODO: check that the angles are linearly spaced between 0 and pi
 
diff --git a/src/ForwardProjectionAlgorithm.cpp b/src/ForwardProjectionAlgorithm.cpp
index b530491..f356824 100644
--- a/src/ForwardProjectionAlgorithm.cpp
+++ b/src/ForwardProjectionAlgorithm.cpp
@@ -126,37 +126,34 @@ bool CForwardProjectionAlgorithm::initialize(const Config& _cfg)
 	}
 
 	// projector
-	XMLNode* node = _cfg.self->getSingleNode("ProjectorId");
+	XMLNode node = _cfg.self.getSingleNode("ProjectorId");
 	ASTRA_CONFIG_CHECK(node, "ForwardProjection", "No ProjectorId tag specified.");
-	int id = boost::lexical_cast<int>(node->getContent());
+	int id = boost::lexical_cast<int>(node.getContent());
 	m_pProjector = CProjector2DManager::getSingleton().get(id);
-	ASTRA_DELETE(node);
 
 	// sinogram data
-	node = _cfg.self->getSingleNode("ProjectionDataId");
+	node = _cfg.self.getSingleNode("ProjectionDataId");
 	ASTRA_CONFIG_CHECK(node, "ForwardProjection", "No ProjectionDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 
 	// volume data
-	node = _cfg.self->getSingleNode("VolumeDataId");
+	node = _cfg.self.getSingleNode("VolumeDataId");
 	ASTRA_CONFIG_CHECK(node, "ForwardProjection", "No VolumeDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pVolume = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	
 	// volume mask
-	if (_cfg.self->hasOption("VolumeMaskId")) {
+	if (_cfg.self.hasOption("VolumeMaskId")) {
 		m_bUseVolumeMask = true;
-		id = boost::lexical_cast<int>(_cfg.self->getOption("VolumeMaskId"));
+		id = boost::lexical_cast<int>(_cfg.self.getOption("VolumeMaskId"));
 		m_pVolumeMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
 	}
 
 	// sino mask
-	if (_cfg.self->hasOption("SinogramMaskId")) {
+	if (_cfg.self.hasOption("SinogramMaskId")) {
 		m_bUseSinogramMask = true;
-		id = boost::lexical_cast<int>(_cfg.self->getOption("SinogramMaskId"));
+		id = boost::lexical_cast<int>(_cfg.self.getOption("SinogramMaskId"));
 		m_pSinogramMask = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
 	}
 
diff --git a/src/ParallelBeamBlobKernelProjector2D.cpp b/src/ParallelBeamBlobKernelProjector2D.cpp
index 3253f88..4559a48 100644
--- a/src/ParallelBeamBlobKernelProjector2D.cpp
+++ b/src/ParallelBeamBlobKernelProjector2D.cpp
@@ -128,28 +128,28 @@ bool CParallelBeamBlobKernelProjector2D::initialize(const Config& _cfg)
 	}
 
 	// required: Kernel
-	XMLNode* node = _cfg.self->getSingleNode("Kernel");
+	XMLNode node = _cfg.self.getSingleNode("Kernel");
 	ASTRA_CONFIG_CHECK(node, "BlobProjector", "No Kernel tag specified.");
 	{
 		// Required: KernelSize
-		XMLNode* node2 = node->getSingleNode("KernelSize");
+		XMLNode node2 = node.getSingleNode("KernelSize");
 		ASTRA_CONFIG_CHECK(node2, "BlobProjector", "No Kernel/KernelSize tag specified.");
-		m_fBlobSize = boost::lexical_cast<float32>(node2->getContent());
+		m_fBlobSize = boost::lexical_cast<float32>(node2.getContent());
 
 		// Required: SampleRate
-		node2 = node->getSingleNode("SampleRate");
+		node2 = node.getSingleNode("SampleRate");
 		ASTRA_CONFIG_CHECK(node2, "BlobProjector", "No Kernel/SampleRate tag specified.");
-		m_fBlobSampleRate = boost::lexical_cast<float32>(node2->getContent());
+		m_fBlobSampleRate = boost::lexical_cast<float32>(node2.getContent());
 	
 		// Required: SampleCount
-		node2 = node->getSingleNode("SampleCount");
+		node2 = node.getSingleNode("SampleCount");
 		ASTRA_CONFIG_CHECK(node2, "BlobProjector", "No Kernel/SampleCount tag specified.");
-		m_iBlobSampleCount = boost::lexical_cast<int>(node2->getContent());
+		m_iBlobSampleCount = boost::lexical_cast<int>(node2.getContent());
 	
 		// Required: KernelValues
-		node2 = node->getSingleNode("KernelValues");
+		node2 = node.getSingleNode("KernelValues");
 		ASTRA_CONFIG_CHECK(node2, "BlobProjector", "No Kernel/KernelValues tag specified.");
-		vector<float32> values = node2->getContentNumericalArray();
+		vector<float32> values = node2.getContentNumericalArray();
 		ASTRA_CONFIG_CHECK(values.size() == (unsigned int)m_iBlobSampleCount, "BlobProjector", "Number of specified values doesn't match SampleCount.");
 		m_pfBlobValues = new float32[m_iBlobSampleCount];
 		for (int i = 0; i < m_iBlobSampleCount; i++) {
@@ -157,9 +157,9 @@ bool CParallelBeamBlobKernelProjector2D::initialize(const Config& _cfg)
 		}
 
 		// Required: KernelValues
-		node2 = node->getSingleNode("KernelValuesNeg");
+		node2 = node.getSingleNode("KernelValuesNeg");
 		ASTRA_CONFIG_CHECK(node2, "BlobProjector", "No Kernel/KernelValuesNeg tag specified.");
-		vector<float32> values2 = node2->getContentNumericalArray();
+		vector<float32> values2 = node2.getContentNumericalArray();
 		ASTRA_CONFIG_CHECK(values2.size() == (unsigned int)m_iBlobSampleCount, "BlobProjector", "Number of specified values doesn't match SampleCount.");
 		m_pfBlobValuesNeg = new float32[m_iBlobSampleCount];
 		for (int i = 0; i < m_iBlobSampleCount; i++) {
diff --git a/src/ParallelProjectionGeometry2D.cpp b/src/ParallelProjectionGeometry2D.cpp
index cac8f30..699e141 100644
--- a/src/ParallelProjectionGeometry2D.cpp
+++ b/src/ParallelProjectionGeometry2D.cpp
@@ -176,10 +176,10 @@ Config* CParallelProjectionGeometry2D::getConfiguration() const
 {
 	Config* cfg = new Config();
 	cfg->initialize("ProjectionGeometry2D");
-	cfg->self->addAttribute("type", "parallel");
-	cfg->self->addChildNode("DetectorCount", getDetectorCount());
-	cfg->self->addChildNode("DetectorWidth", getDetectorWidth());
-	cfg->self->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
+	cfg->self.addAttribute("type", "parallel");
+	cfg->self.addChildNode("DetectorCount", getDetectorCount());
+	cfg->self.addChildNode("DetectorWidth", getDetectorWidth());
+	cfg->self.addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
 	return cfg;
 }
 //----------------------------------------------------------------------------------------
diff --git a/src/ParallelProjectionGeometry3D.cpp b/src/ParallelProjectionGeometry3D.cpp
index eb200f9..1c87157 100644
--- a/src/ParallelProjectionGeometry3D.cpp
+++ b/src/ParallelProjectionGeometry3D.cpp
@@ -164,12 +164,12 @@ Config* CParallelProjectionGeometry3D::getConfiguration() const
 {
 	Config* cfg = new Config();
 	cfg->initialize("ProjectionGeometry3D");
-	cfg->self->addAttribute("type", "parallel3d");
-	cfg->self->addChildNode("DetectorRowCount", m_iDetectorRowCount);
-	cfg->self->addChildNode("DetectorColCount", m_iDetectorColCount);
-	cfg->self->addChildNode("DetectorSpacingX", m_fDetectorSpacingX);
-	cfg->self->addChildNode("DetectorSpacingY", m_fDetectorSpacingY);
-	cfg->self->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
+	cfg->self.addAttribute("type", "parallel3d");
+	cfg->self.addChildNode("DetectorRowCount", m_iDetectorRowCount);
+	cfg->self.addChildNode("DetectorColCount", m_iDetectorColCount);
+	cfg->self.addChildNode("DetectorSpacingX", m_fDetectorSpacingX);
+	cfg->self.addChildNode("DetectorSpacingY", m_fDetectorSpacingY);
+	cfg->self.addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
 	return cfg;
 }
 //----------------------------------------------------------------------------------------
diff --git a/src/ParallelVecProjectionGeometry3D.cpp b/src/ParallelVecProjectionGeometry3D.cpp
index dc325e9..ffad6d0 100644
--- a/src/ParallelVecProjectionGeometry3D.cpp
+++ b/src/ParallelVecProjectionGeometry3D.cpp
@@ -73,33 +73,30 @@ bool CParallelVecProjectionGeometry3D::initialize(const Config& _cfg)
 	ASTRA_ASSERT(_cfg.self);
 	ConfigStackCheck<CProjectionGeometry3D> CC("ParallelVecProjectionGeometry3D", this, _cfg);	
 
-	XMLNode* node;
+	XMLNode node;
 
 	// TODO: Fix up class hierarchy... this class doesn't fit very well.
 	// initialization of parent class
 	//CProjectionGeometry3D::initialize(_cfg);
 
 	// Required: DetectorRowCount
-	node = _cfg.self->getSingleNode("DetectorRowCount");
+	node = _cfg.self.getSingleNode("DetectorRowCount");
 	ASTRA_CONFIG_CHECK(node, "ParallelVecProjectionGeometry3D", "No DetectorRowCount tag specified.");
-	m_iDetectorRowCount = boost::lexical_cast<int>(node->getContent());
-	ASTRA_DELETE(node);
+	m_iDetectorRowCount = boost::lexical_cast<int>(node.getContent());
 	CC.markNodeParsed("DetectorRowCount");
 
 	// Required: DetectorCount
-	node = _cfg.self->getSingleNode("DetectorColCount");
+	node = _cfg.self.getSingleNode("DetectorColCount");
 	ASTRA_CONFIG_CHECK(node, "", "No DetectorColCount tag specified.");
-	m_iDetectorColCount = boost::lexical_cast<int>(node->getContent());
+	m_iDetectorColCount = boost::lexical_cast<int>(node.getContent());
 	m_iDetectorTotCount = m_iDetectorRowCount * m_iDetectorColCount;
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("DetectorColCount");
 
 	// Required: Vectors
-	node = _cfg.self->getSingleNode("Vectors");
+	node = _cfg.self.getSingleNode("Vectors");
 	ASTRA_CONFIG_CHECK(node, "ParallelVecProjectionGeometry3D", "No Vectors tag specified.");
-	vector<double> data = node->getContentNumericalArrayDouble();
+	vector<double> data = node.getContentNumericalArrayDouble();
 	CC.markNodeParsed("Vectors");
-	ASTRA_DELETE(node);
 	ASTRA_CONFIG_CHECK(data.size() % 12 == 0, "ParallelVecProjectionGeometry3D", "Vectors doesn't consist of 12-tuples.");
 	m_iProjectionAngleCount = data.size() / 12;
 	m_pProjectionAngles = new SPar3DProjection[m_iProjectionAngleCount];
@@ -208,9 +205,9 @@ Config* CParallelVecProjectionGeometry3D::getConfiguration() const
 	Config* cfg = new Config();
 	cfg->initialize("ProjectionGeometry3D");
 
-	cfg->self->addAttribute("type", "parallel3d_vec");
-	cfg->self->addChildNode("DetectorRowCount", m_iDetectorRowCount);
-	cfg->self->addChildNode("DetectorColCount", m_iDetectorColCount);
+	cfg->self.addAttribute("type", "parallel3d_vec");
+	cfg->self.addChildNode("DetectorRowCount", m_iDetectorRowCount);
+	cfg->self.addChildNode("DetectorColCount", m_iDetectorColCount);
 
 	std::string vectors = "";
 	for (int i = 0; i < m_iProjectionAngleCount; ++i) {
@@ -229,7 +226,7 @@ Config* CParallelVecProjectionGeometry3D::getConfiguration() const
 		vectors += boost::lexical_cast<string>(p.fDetVZ);
 		if (i < m_iProjectionAngleCount-1) vectors += ';';
 	}
-	cfg->self->addChildNode("Vectors", vectors);
+	cfg->self.addChildNode("Vectors", vectors);
 
 	return cfg;
 }
diff --git a/src/ProjectionGeometry2D.cpp b/src/ProjectionGeometry2D.cpp
index 89b5fe0..b89605b 100644
--- a/src/ProjectionGeometry2D.cpp
+++ b/src/ProjectionGeometry2D.cpp
@@ -124,24 +124,21 @@ bool CProjectionGeometry2D::initialize(const Config& _cfg)
 	}
 
 	// Required: DetectorWidth
-	XMLNode* node = _cfg.self->getSingleNode("DetectorWidth");
+	XMLNode node = _cfg.self.getSingleNode("DetectorWidth");
 	ASTRA_CONFIG_CHECK(node, "ProjectionGeometry2D", "No DetectorWidth tag specified.");
-	m_fDetectorWidth = boost::lexical_cast<float32>(node->getContent());
-	ASTRA_DELETE(node);
+	m_fDetectorWidth = boost::lexical_cast<float32>(node.getContent());
 	CC.markNodeParsed("DetectorWidth");
 
 	// Required: DetectorCount
-	node = _cfg.self->getSingleNode("DetectorCount");
+	node = _cfg.self.getSingleNode("DetectorCount");
 	ASTRA_CONFIG_CHECK(node, "ProjectionGeometry2D", "No DetectorCount tag specified.");
-	m_iDetectorCount = boost::lexical_cast<int>(node->getContent());
-	ASTRA_DELETE(node);
+	m_iDetectorCount = boost::lexical_cast<int>(node.getContent());
 	CC.markNodeParsed("DetectorCount");
 
 	// Required: ProjectionAngles
-	node = _cfg.self->getSingleNode("ProjectionAngles");
+	node = _cfg.self.getSingleNode("ProjectionAngles");
 	ASTRA_CONFIG_CHECK(node, "ProjectionGeometry2D", "No ProjectionAngles tag specified.");
-	vector<float32> angles = node->getContentNumericalArray();
-	delete node;
+	vector<float32> angles = node.getContentNumericalArray();
 	m_iProjectionAngleCount = angles.size();
 	ASTRA_CONFIG_CHECK(m_iProjectionAngleCount > 0, "ProjectionGeometry2D", "Not enough ProjectionAngles specified.");
 	m_pfProjectionAngles = new float32[m_iProjectionAngleCount];
@@ -150,7 +147,7 @@ bool CProjectionGeometry2D::initialize(const Config& _cfg)
 	}
 	CC.markNodeParsed("ProjectionAngles");
 
-	vector<float32> offset = _cfg.self->getOptionNumericalArray("ExtraDetectorOffset");
+	vector<float32> offset = _cfg.self.getOptionNumericalArray("ExtraDetectorOffset");
 	m_pfExtraDetectorOffset = new float32[m_iProjectionAngleCount];
 	if (offset.size() == (size_t)m_iProjectionAngleCount) {
 		for (int i = 0; i < m_iProjectionAngleCount; i++) {
diff --git a/src/ProjectionGeometry3D.cpp b/src/ProjectionGeometry3D.cpp
index 5b77767..ef0246c 100644
--- a/src/ProjectionGeometry3D.cpp
+++ b/src/ProjectionGeometry3D.cpp
@@ -149,38 +149,34 @@ bool CProjectionGeometry3D::initialize(const Config& _cfg)
 	ASTRA_ASSERT(_cfg.self);
 	
 	// Required: DetectorWidth
-	XMLNode* node = _cfg.self->getSingleNode("DetectorSpacingX");
+	XMLNode node = _cfg.self.getSingleNode("DetectorSpacingX");
 	ASTRA_CONFIG_CHECK(node, "ProjectionGeometry3D", "No DetectorSpacingX tag specified.");
-	m_fDetectorSpacingX = boost::lexical_cast<float32>(node->getContent());
-	ASTRA_DELETE(node);
+	m_fDetectorSpacingX = boost::lexical_cast<float32>(node.getContent());
 	CC.markNodeParsed("DetectorSpacingX");
 
 	// Required: DetectorHeight
-	node = _cfg.self->getSingleNode("DetectorSpacingY");
+	node = _cfg.self.getSingleNode("DetectorSpacingY");
 	ASTRA_CONFIG_CHECK(node, "ProjectionGeometry3D", "No DetectorSpacingY tag specified.");
-	m_fDetectorSpacingY = boost::lexical_cast<float32>(node->getContent());
-	ASTRA_DELETE(node);
+	m_fDetectorSpacingY = boost::lexical_cast<float32>(node.getContent());
 	CC.markNodeParsed("DetectorSpacingY");
 
 	// Required: DetectorRowCount
-	node = _cfg.self->getSingleNode("DetectorRowCount");
+	node = _cfg.self.getSingleNode("DetectorRowCount");
 	ASTRA_CONFIG_CHECK(node, "ProjectionGeometry3D", "No DetectorRowCount tag specified.");
-	m_iDetectorRowCount = boost::lexical_cast<int>(node->getContent());
-	ASTRA_DELETE(node);
+	m_iDetectorRowCount = boost::lexical_cast<int>(node.getContent());
 	CC.markNodeParsed("DetectorRowCount");
 
 	// Required: DetectorCount
-	node = _cfg.self->getSingleNode("DetectorColCount");
+	node = _cfg.self.getSingleNode("DetectorColCount");
 	ASTRA_CONFIG_CHECK(node, "ProjectionGeometry3D", "No DetectorColCount tag specified.");
-	m_iDetectorColCount = boost::lexical_cast<int>(node->getContent());
+	m_iDetectorColCount = boost::lexical_cast<int>(node.getContent());
 	m_iDetectorTotCount = m_iDetectorRowCount * m_iDetectorColCount;
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("DetectorColCount");
 
 	// Required: ProjectionAngles
-	node = _cfg.self->getSingleNode("ProjectionAngles");
+	node = _cfg.self.getSingleNode("ProjectionAngles");
 	ASTRA_CONFIG_CHECK(node, "ProjectionGeometry3D", "No ProjectionAngles tag specified.");
-	vector<float32> angles = node->getContentNumericalArray();
+	vector<float32> angles = node.getContentNumericalArray();
 	m_iProjectionAngleCount = angles.size();
 	ASTRA_CONFIG_CHECK(m_iProjectionAngleCount > 0, "ProjectionGeometry3D", "Not enough ProjectionAngles specified.");
 	m_pfProjectionAngles = new float32[m_iProjectionAngleCount];
@@ -188,7 +184,6 @@ bool CProjectionGeometry3D::initialize(const Config& _cfg)
 		m_pfProjectionAngles[i] = angles[i];
 	}
 	CC.markNodeParsed("ProjectionAngles");
-	ASTRA_DELETE(node);
 
 	// Interface class, so don't return true
 	return false;
diff --git a/src/Projector2D.cpp b/src/Projector2D.cpp
index 32a2956..cf233a0 100644
--- a/src/Projector2D.cpp
+++ b/src/Projector2D.cpp
@@ -114,12 +114,12 @@ bool CProjector2D::initialize(const Config& _cfg)
 	}
 
 	// required: ProjectionGeometry
-	XMLNode* node = _cfg.self->getSingleNode("ProjectionGeometry");
+	XMLNode node = _cfg.self.getSingleNode("ProjectionGeometry");
 	ASTRA_CONFIG_CHECK(node, "Projector2D", "No ProjectionGeometry tag specified.");
 
 	// FIXME: Change how the base class is created. (This is duplicated
 	// in astra_mex_data2d.cpp.)
-	std::string type = node->getAttribute("type");
+	std::string type = node.getAttribute("type");
 	if (type == "sparse_matrix") {
 		m_pProjectionGeometry = new CSparseMatrixProjectionGeometry2D();
 		m_pProjectionGeometry->initialize(Config(node));
@@ -141,7 +141,7 @@ bool CProjector2D::initialize(const Config& _cfg)
 
 
 	// required: VolumeGeometry
-	node = _cfg.self->getSingleNode("VolumeGeometry");
+	node = _cfg.self.getSingleNode("VolumeGeometry");
 	ASTRA_CONFIG_CHECK(node, "Projector2D", "No VolumeGeometry tag specified.");
 	m_pVolumeGeometry = new CVolumeGeometry2D();
 	m_pVolumeGeometry->initialize(Config(node));
diff --git a/src/Projector3D.cpp b/src/Projector3D.cpp
index 14cb16a..5e22105 100644
--- a/src/Projector3D.cpp
+++ b/src/Projector3D.cpp
@@ -92,11 +92,11 @@ bool CProjector3D::initialize(const Config& _cfg)
 	assert(_cfg.self);
 	ConfigStackCheck<CProjector3D> CC("Projector3D", this, _cfg);
 
-	XMLNode* node;
+	XMLNode node;
 
-	node = _cfg.self->getSingleNode("ProjectionGeometry");
+	node = _cfg.self.getSingleNode("ProjectionGeometry");
 	ASTRA_CONFIG_CHECK(node, "Projector3D", "No ProjectionGeometry tag specified.");
-	std::string type = node->getAttribute("type");
+	std::string type = node.getAttribute("type");
 	CProjectionGeometry3D* pProjGeometry = 0;
 	if (type == "parallel3d") {
 		pProjGeometry = new CParallelProjectionGeometry3D();
@@ -115,7 +115,7 @@ bool CProjector3D::initialize(const Config& _cfg)
 	ASTRA_CONFIG_CHECK(m_pProjectionGeometry->isInitialized(), "Projector3D", "ProjectionGeometry not initialized.");
 	CC.markNodeParsed("ProjectionGeometry");
 
-	node = _cfg.self->getSingleNode("VolumeGeometry");
+	node = _cfg.self.getSingleNode("VolumeGeometry");
 	ASTRA_CONFIG_CHECK(node, "Projector3D", "No VolumeGeometry tag specified.");
 	CVolumeGeometry3D* pVolGeometry = new CVolumeGeometry3D();
 	pVolGeometry->initialize(Config(node)); // this deletes node
diff --git a/src/ReconstructionAlgorithm2D.cpp b/src/ReconstructionAlgorithm2D.cpp
index e089fac..767efe6 100644
--- a/src/ReconstructionAlgorithm2D.cpp
+++ b/src/ReconstructionAlgorithm2D.cpp
@@ -84,71 +84,68 @@ bool CReconstructionAlgorithm2D::initialize(const Config& _cfg)
 	ConfigStackCheck<CAlgorithm> CC("ReconstructionAlgorithm2D", this, _cfg);
 	
 	// projector
-	XMLNode* node = _cfg.self->getSingleNode("ProjectorId");
+	XMLNode node = _cfg.self.getSingleNode("ProjectorId");
 	ASTRA_CONFIG_CHECK(node, "Reconstruction2D", "No ProjectorId tag specified.");
-	int id = boost::lexical_cast<int>(node->getContent());
+	int id = boost::lexical_cast<int>(node.getContent());
 	m_pProjector = CProjector2DManager::getSingleton().get(id);
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("ProjectorId");
 
 	// sinogram data
-	node = _cfg.self->getSingleNode("ProjectionDataId");
+	node = _cfg.self.getSingleNode("ProjectionDataId");
 	ASTRA_CONFIG_CHECK(node, "Reconstruction2D", "No ProjectionDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pSinogram = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("ProjectionDataId");
 
 	// reconstruction data
-	node = _cfg.self->getSingleNode("ReconstructionDataId");
+	node = _cfg.self.getSingleNode("ReconstructionDataId");
 	ASTRA_CONFIG_CHECK(node, "Reconstruction2D", "No ReconstructionDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pReconstruction = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("ReconstructionDataId");
 
 	// fixed mask
-	if (_cfg.self->hasOption("ReconstructionMaskId")) {
+	if (_cfg.self.hasOption("ReconstructionMaskId")) {
 		m_bUseReconstructionMask = true;
-		id = boost::lexical_cast<int>(_cfg.self->getOption("ReconstructionMaskId"));
+		id = boost::lexical_cast<int>(_cfg.self.getOption("ReconstructionMaskId"));
 		m_pReconstructionMask = dynamic_cast<CFloat32VolumeData2D*>(CData2DManager::getSingleton().get(id));
 		ASTRA_CONFIG_CHECK(m_pReconstructionMask, "Reconstruction2D", "Invalid ReconstructionMaskId.");
 	}
 	CC.markOptionParsed("ReconstructionMaskId");
 
 	// fixed mask
-	if (_cfg.self->hasOption("SinogramMaskId")) {
+	if (_cfg.self.hasOption("SinogramMaskId")) {
 		m_bUseSinogramMask = true;
-		id = boost::lexical_cast<int>(_cfg.self->getOption("SinogramMaskId"));
+		id = boost::lexical_cast<int>(_cfg.self.getOption("SinogramMaskId"));
 		m_pSinogramMask = dynamic_cast<CFloat32ProjectionData2D*>(CData2DManager::getSingleton().get(id));
 		ASTRA_CONFIG_CHECK(m_pSinogramMask, "Reconstruction2D", "Invalid SinogramMaskId.");
 	}
 	CC.markOptionParsed("SinogramMaskId");
 
 	// Constraints - NEW
-	if (_cfg.self->hasOption("MinConstraint")) {
+	if (_cfg.self.hasOption("MinConstraint")) {
 		m_bUseMinConstraint = true;
-		m_fMinValue = _cfg.self->getOptionNumerical("MinConstraint", 0.0f);
+		m_fMinValue = _cfg.self.getOptionNumerical("MinConstraint", 0.0f);
 		CC.markOptionParsed("MinConstraint");
 	} else {
 		// Constraint - OLD
-		m_bUseMinConstraint = _cfg.self->getOptionBool("UseMinConstraint", false);
+		m_bUseMinConstraint = _cfg.self.getOptionBool("UseMinConstraint", false);
 		CC.markOptionParsed("UseMinConstraint");
 		if (m_bUseMinConstraint) {
-			m_fMinValue = _cfg.self->getOptionNumerical("MinConstraintValue", 0.0f);
+			m_fMinValue = _cfg.self.getOptionNumerical("MinConstraintValue", 0.0f);
 			CC.markOptionParsed("MinConstraintValue");
 		}
 	}
-	if (_cfg.self->hasOption("MaxConstraint")) {
+	if (_cfg.self.hasOption("MaxConstraint")) {
 		m_bUseMaxConstraint = true;
-		m_fMaxValue = _cfg.self->getOptionNumerical("MaxConstraint", 255.0f);
+		m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraint", 255.0f);
 		CC.markOptionParsed("MaxConstraint");
 	} else {
 		// Constraint - OLD
-		m_bUseMaxConstraint = _cfg.self->getOptionBool("UseMaxConstraint", false);
+		m_bUseMaxConstraint = _cfg.self.getOptionBool("UseMaxConstraint", false);
 		CC.markOptionParsed("UseMaxConstraint");
 		if (m_bUseMaxConstraint) {
-			m_fMaxValue = _cfg.self->getOptionNumerical("MaxConstraintValue", 0.0f);
+			m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraintValue", 0.0f);
 			CC.markOptionParsed("MaxConstraintValue");
 		}
 	}
diff --git a/src/ReconstructionAlgorithm3D.cpp b/src/ReconstructionAlgorithm3D.cpp
index 13d069d..86b8ab2 100644
--- a/src/ReconstructionAlgorithm3D.cpp
+++ b/src/ReconstructionAlgorithm3D.cpp
@@ -104,7 +104,7 @@ bool CReconstructionAlgorithm3D::initialize(const Config& _cfg)
 	ASTRA_ASSERT(_cfg.self);
 	ConfigStackCheck<CAlgorithm> CC("ReconstructionAlgorithm3D", this, _cfg);
 
-	XMLNode* node;
+	XMLNode node;
 	int id;
 #if 0
 	// projector
@@ -116,60 +116,58 @@ bool CReconstructionAlgorithm3D::initialize(const Config& _cfg)
 #endif
 
 	// sinogram data
-	node = _cfg.self->getSingleNode("ProjectionDataId");
+	node = _cfg.self.getSingleNode("ProjectionDataId");
 	ASTRA_CONFIG_CHECK(node, "Reconstruction3D", "No ProjectionDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pSinogram = dynamic_cast<CFloat32ProjectionData3D*>(CData3DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("ProjectionDataId");
 
 	// reconstruction data
-	node = _cfg.self->getSingleNode("ReconstructionDataId");
+	node = _cfg.self.getSingleNode("ReconstructionDataId");
 	ASTRA_CONFIG_CHECK(node, "Reconstruction3D", "No ReconstructionDataId tag specified.");
-	id = boost::lexical_cast<int>(node->getContent());
+	id = boost::lexical_cast<int>(node.getContent());
 	m_pReconstruction = dynamic_cast<CFloat32VolumeData3D*>(CData3DManager::getSingleton().get(id));
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("ReconstructionDataId");
 
 	// fixed mask
-	if (_cfg.self->hasOption("ReconstructionMaskId")) {
+	if (_cfg.self.hasOption("ReconstructionMaskId")) {
 		m_bUseReconstructionMask = true;
-		id = boost::lexical_cast<int>(_cfg.self->getOption("ReconstructionMaskId"));
+		id = boost::lexical_cast<int>(_cfg.self.getOption("ReconstructionMaskId"));
 		m_pReconstructionMask = dynamic_cast<CFloat32VolumeData3D*>(CData3DManager::getSingleton().get(id));
 	}
 	CC.markOptionParsed("ReconstructionMaskId");
 
 	// fixed mask
-	if (_cfg.self->hasOption("SinogramMaskId")) {
+	if (_cfg.self.hasOption("SinogramMaskId")) {
 		m_bUseSinogramMask = true;
-		id = boost::lexical_cast<int>(_cfg.self->getOption("SinogramMaskId"));
+		id = boost::lexical_cast<int>(_cfg.self.getOption("SinogramMaskId"));
 		m_pSinogramMask = dynamic_cast<CFloat32ProjectionData3D*>(CData3DManager::getSingleton().get(id));
 	}
 
 	// Constraints - NEW
-	if (_cfg.self->hasOption("MinConstraint")) {
+	if (_cfg.self.hasOption("MinConstraint")) {
 		m_bUseMinConstraint = true;
-		m_fMinValue = _cfg.self->getOptionNumerical("MinConstraint", 0.0f);
+		m_fMinValue = _cfg.self.getOptionNumerical("MinConstraint", 0.0f);
 		CC.markOptionParsed("MinConstraint");
 	} else {
 		// Constraint - OLD
-		m_bUseMinConstraint = _cfg.self->getOptionBool("UseMinConstraint", false);
+		m_bUseMinConstraint = _cfg.self.getOptionBool("UseMinConstraint", false);
 		CC.markOptionParsed("UseMinConstraint");
 		if (m_bUseMinConstraint) {
-			m_fMinValue = _cfg.self->getOptionNumerical("MinConstraintValue", 0.0f);
+			m_fMinValue = _cfg.self.getOptionNumerical("MinConstraintValue", 0.0f);
 			CC.markOptionParsed("MinConstraintValue");
 		}
 	}
-	if (_cfg.self->hasOption("MaxConstraint")) {
+	if (_cfg.self.hasOption("MaxConstraint")) {
 		m_bUseMaxConstraint = true;
-		m_fMaxValue = _cfg.self->getOptionNumerical("MaxConstraint", 255.0f);
+		m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraint", 255.0f);
 		CC.markOptionParsed("MaxConstraint");
 	} else {
 		// Constraint - OLD
-		m_bUseMaxConstraint = _cfg.self->getOptionBool("UseMaxConstraint", false);
+		m_bUseMaxConstraint = _cfg.self.getOptionBool("UseMaxConstraint", false);
 		CC.markOptionParsed("UseMaxConstraint");
 		if (m_bUseMaxConstraint) {
-			m_fMaxValue = _cfg.self->getOptionNumerical("MaxConstraintValue", 0.0f);
+			m_fMaxValue = _cfg.self.getOptionNumerical("MaxConstraintValue", 0.0f);
 			CC.markOptionParsed("MaxConstraintValue");
 		}
 	}
diff --git a/src/SartAlgorithm.cpp b/src/SartAlgorithm.cpp
index f7a1677..e4dc5c7 100644
--- a/src/SartAlgorithm.cpp
+++ b/src/SartAlgorithm.cpp
@@ -126,7 +126,7 @@ bool CSartAlgorithm::initialize(const Config& _cfg)
 	// projection order
 	m_iCurrentProjection = 0;
 	m_iProjectionCount = m_pProjector->getProjectionGeometry()->getProjectionAngleCount();
-	string projOrder = _cfg.self->getOption("ProjectionOrder", "sequential");
+	string projOrder = _cfg.self.getOption("ProjectionOrder", "sequential");
 	CC.markOptionParsed("ProjectionOrder");
 	if (projOrder == "sequential") {
 		m_piProjectionOrder = new int[m_iProjectionCount];
@@ -145,7 +145,7 @@ bool CSartAlgorithm::initialize(const Config& _cfg)
 			m_piProjectionOrder[i + k] = t;
 		}
 	} else if (projOrder == "custom") {
-		vector<float32> projOrderList = _cfg.self->getOptionNumericalArray("ProjectionOrderList");
+		vector<float32> projOrderList = _cfg.self.getOptionNumericalArray("ProjectionOrderList");
 		m_piProjectionOrder = new int[projOrderList.size()];
 		for (int i = 0; i < m_iProjectionCount; i++) {
 			m_piProjectionOrder[i] = static_cast<int>(projOrderList[i]);
diff --git a/src/SparseMatrixProjectionGeometry2D.cpp b/src/SparseMatrixProjectionGeometry2D.cpp
index 86357d2..073720f 100644
--- a/src/SparseMatrixProjectionGeometry2D.cpp
+++ b/src/SparseMatrixProjectionGeometry2D.cpp
@@ -98,11 +98,10 @@ bool CSparseMatrixProjectionGeometry2D::initialize(const Config& _cfg)
 	CProjectionGeometry2D::initialize(_cfg);
 
 	// get matrix
-	XMLNode* node = _cfg.self->getSingleNode("MatrixID");
+	XMLNode node = _cfg.self.getSingleNode("MatrixID");
 	ASTRA_CONFIG_CHECK(node, "SparseMatrixProjectionGeometry2D", "No MatrixID tag specified.");
-	int id = boost::lexical_cast<int>(node->getContent());
+	int id = boost::lexical_cast<int>(node.getContent());
 	m_pMatrix = CMatrixManager::getSingleton().get(id);
-	ASTRA_DELETE(node);
 	CC.markNodeParsed("MatrixID");
 
 	// success
@@ -194,11 +193,11 @@ Config* CSparseMatrixProjectionGeometry2D::getConfiguration() const
 {
 	Config* cfg = new Config();
 	cfg->initialize("ProjectionGeometry2D");
-	cfg->self->addAttribute("type", "sparse matrix");
-	cfg->self->addChildNode("DetectorCount", getDetectorCount());
-	cfg->self->addChildNode("DetectorWidth", getDetectorWidth());
-	cfg->self->addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
-	cfg->self->addChildNode("MatrixID", CMatrixManager::getSingleton().getIndex(m_pMatrix));
+	cfg->self.addAttribute("type", "sparse matrix");
+	cfg->self.addChildNode("DetectorCount", getDetectorCount());
+	cfg->self.addChildNode("DetectorWidth", getDetectorWidth());
+	cfg->self.addChildNode("ProjectionAngles", m_pfProjectionAngles, m_iProjectionAngleCount);
+	cfg->self.addChildNode("MatrixID", CMatrixManager::getSingleton().getIndex(m_pMatrix));
 	return cfg;
 }
 
diff --git a/src/VolumeGeometry2D.cpp b/src/VolumeGeometry2D.cpp
index d412914..6eea1b2 100644
--- a/src/VolumeGeometry2D.cpp
+++ b/src/VolumeGeometry2D.cpp
@@ -164,24 +164,22 @@ bool CVolumeGeometry2D::initialize(const Config& _cfg)
 	}
 
 	// Required: GridColCount
-	XMLNode* node = _cfg.self->getSingleNode("GridColCount");
+	XMLNode node = _cfg.self.getSingleNode("GridColCount");
 	ASTRA_CONFIG_CHECK(node, "ReconstructionGeometry2D", "No GridColCount tag specified.");
-	m_iGridColCount = boost::lexical_cast<int>(node->getContent());
-	ASTRA_DELETE(node);
+	m_iGridColCount = boost::lexical_cast<int>(node.getContent());
 	CC.markNodeParsed("GridColCount");
 
 	// Required: GridRowCount
-	node = _cfg.self->getSingleNode("GridRowCount");
+	node = _cfg.self.getSingleNode("GridRowCount");
 	ASTRA_CONFIG_CHECK(node, "ReconstructionGeometry2D", "No GridRowCount tag specified.");
-	m_iGridRowCount = boost::lexical_cast<int>(node->getContent());
-	ASTRA_DELETE(node);
+	m_iGridRowCount = boost::lexical_cast<int>(node.getContent());
 	CC.markNodeParsed("GridRowCount");
 
 	// Optional: Window minima and maxima
-	m_fWindowMinX = _cfg.self->getOptionNumerical("WindowMinX", -m_iGridColCount/2.0f);
-	m_fWindowMaxX = _cfg.self->getOptionNumerical("WindowMaxX", m_iGridColCount/2.0f);
-	m_fWindowMinY = _cfg.self->getOptionNumerical("WindowMinY", -m_iGridRowCount/2.0f);
-	m_fWindowMaxY = _cfg.self->getOptionNumerical("WindowMaxY", m_iGridRowCount/2.0f);
+	m_fWindowMinX = _cfg.self.getOptionNumerical("WindowMinX", -m_iGridColCount/2.0f);
+	m_fWindowMaxX = _cfg.self.getOptionNumerical("WindowMaxX", m_iGridColCount/2.0f);
+	m_fWindowMinY = _cfg.self.getOptionNumerical("WindowMinY", -m_iGridRowCount/2.0f);
+	m_fWindowMaxY = _cfg.self.getOptionNumerical("WindowMaxY", m_iGridRowCount/2.0f);
 	CC.markOptionParsed("WindowMinX");
 	CC.markOptionParsed("WindowMaxX");
 	CC.markOptionParsed("WindowMinY");
@@ -285,13 +283,13 @@ Config* CVolumeGeometry2D::getConfiguration() const
 	Config* cfg = new Config();
 	cfg->initialize("VolumeGeometry2D");
 
-	cfg->self->addChildNode("GridColCount", m_iGridColCount);
-	cfg->self->addChildNode("GridRowCount", m_iGridRowCount);
+	cfg->self.addChildNode("GridColCount", m_iGridColCount);
+	cfg->self.addChildNode("GridRowCount", m_iGridRowCount);
 
-	cfg->self->addOption("WindowMinX", m_fWindowMinX);
-	cfg->self->addOption("WindowMaxX", m_fWindowMaxX);
-	cfg->self->addOption("WindowMinY", m_fWindowMinY);
-	cfg->self->addOption("WindowMaxY", m_fWindowMaxY);
+	cfg->self.addOption("WindowMinX", m_fWindowMinX);
+	cfg->self.addOption("WindowMaxX", m_fWindowMaxX);
+	cfg->self.addOption("WindowMinY", m_fWindowMinY);
+	cfg->self.addOption("WindowMaxY", m_fWindowMaxY);
 
 	return cfg;
 }
diff --git a/src/VolumeGeometry3D.cpp b/src/VolumeGeometry3D.cpp
index 66e6f0c..a1cf424 100644
--- a/src/VolumeGeometry3D.cpp
+++ b/src/VolumeGeometry3D.cpp
@@ -192,33 +192,30 @@ bool CVolumeGeometry3D::initialize(const Config& _cfg)
 	}
 
 	// Required: GridColCount
-	XMLNode* node = _cfg.self->getSingleNode("GridColCount");
+	XMLNode node = _cfg.self.getSingleNode("GridColCount");
 	ASTRA_CONFIG_CHECK(node, "ReconstructionGeometry2D", "No GridColCount tag specified.");
-	m_iGridColCount = boost::lexical_cast<int>(node->getContent());
-	ASTRA_DELETE(node);
+	m_iGridColCount = boost::lexical_cast<int>(node.getContent());
 	CC.markNodeParsed("GridColCount");
 
 	// Required: GridRowCount
-	node = _cfg.self->getSingleNode("GridRowCount");
+	node = _cfg.self.getSingleNode("GridRowCount");
 	ASTRA_CONFIG_CHECK(node, "ReconstructionGeometry2D", "No GridRowCount tag specified.");
-	m_iGridRowCount = boost::lexical_cast<int>(node->getContent());
-	ASTRA_DELETE(node);
+	m_iGridRowCount = boost::lexical_cast<int>(node.getContent());
 	CC.markNodeParsed("GridRowCount");
 
 	// Required: GridRowCount
-	node = _cfg.self->getSingleNode("GridSliceCount");
+	node = _cfg.self.getSingleNode("GridSliceCount");
 	ASTRA_CONFIG_CHECK(node, "ReconstructionGeometry2D", "No GridSliceCount tag specified.");
-	m_iGridSliceCount = boost::lexical_cast<int>(node->getContent());
-	ASTRA_DELETE(node);
+	m_iGridSliceCount = boost::lexical_cast<int>(node.getContent());
 	CC.markNodeParsed("GridSliceCount");
 
 	// Optional: Window minima and maxima
-	m_fWindowMinX = _cfg.self->getOptionNumerical("WindowMinX", -m_iGridColCount/2.0f);
-	m_fWindowMaxX = _cfg.self->getOptionNumerical("WindowMaxX", m_iGridColCount/2.0f);
-	m_fWindowMinY = _cfg.self->getOptionNumerical("WindowMinY", -m_iGridRowCount/2.0f);
-	m_fWindowMaxY = _cfg.self->getOptionNumerical("WindowMaxY", m_iGridRowCount/2.0f);
-	m_fWindowMinZ = _cfg.self->getOptionNumerical("WindowMinZ", -m_iGridSliceCount/2.0f);
-	m_fWindowMaxZ = _cfg.self->getOptionNumerical("WindowMaxZ", m_iGridSliceCount/2.0f);
+	m_fWindowMinX = _cfg.self.getOptionNumerical("WindowMinX", -m_iGridColCount/2.0f);
+	m_fWindowMaxX = _cfg.self.getOptionNumerical("WindowMaxX", m_iGridColCount/2.0f);
+	m_fWindowMinY = _cfg.self.getOptionNumerical("WindowMinY", -m_iGridRowCount/2.0f);
+	m_fWindowMaxY = _cfg.self.getOptionNumerical("WindowMaxY", m_iGridRowCount/2.0f);
+	m_fWindowMinZ = _cfg.self.getOptionNumerical("WindowMinZ", -m_iGridSliceCount/2.0f);
+	m_fWindowMaxZ = _cfg.self.getOptionNumerical("WindowMaxZ", m_iGridSliceCount/2.0f);
 	CC.markOptionParsed("WindowMinX");
 	CC.markOptionParsed("WindowMaxX");
 	CC.markOptionParsed("WindowMinY");
@@ -386,16 +383,16 @@ Config* CVolumeGeometry3D::getConfiguration() const
 	Config* cfg = new Config();
 	cfg->initialize("VolumeGeometry3D");
 
-	cfg->self->addChildNode("GridColCount", m_iGridColCount);
-	cfg->self->addChildNode("GridRowCount", m_iGridRowCount);
-	cfg->self->addChildNode("GridSliceCount", m_iGridSliceCount);
+	cfg->self.addChildNode("GridColCount", m_iGridColCount);
+	cfg->self.addChildNode("GridRowCount", m_iGridRowCount);
+	cfg->self.addChildNode("GridSliceCount", m_iGridSliceCount);
 
-	cfg->self->addOption("WindowMinX", m_fWindowMinX);
-	cfg->self->addOption("WindowMaxX", m_fWindowMaxX);
-	cfg->self->addOption("WindowMinY", m_fWindowMinY);
-	cfg->self->addOption("WindowMaxY", m_fWindowMaxY);
-	cfg->self->addOption("WindowMinZ", m_fWindowMinZ);
-	cfg->self->addOption("WindowMaxZ", m_fWindowMaxZ);
+	cfg->self.addOption("WindowMinX", m_fWindowMinX);
+	cfg->self.addOption("WindowMaxX", m_fWindowMaxX);
+	cfg->self.addOption("WindowMinY", m_fWindowMinY);
+	cfg->self.addOption("WindowMaxY", m_fWindowMaxY);
+	cfg->self.addOption("WindowMinZ", m_fWindowMinZ);
+	cfg->self.addOption("WindowMaxZ", m_fWindowMaxZ);
 
 	return cfg;
 }
diff --git a/src/XMLDocument.cpp b/src/XMLDocument.cpp
index da843b4..716ed9e 100644
--- a/src/XMLDocument.cpp
+++ b/src/XMLDocument.cpp
@@ -89,10 +89,9 @@ XMLDocument* XMLDocument::createDocument(string sRootName)
 }
 
 //-----------------------------------------------------------------------------
-XMLNode* XMLDocument::getRootNode() 
+XMLNode XMLDocument::getRootNode() 
 {
-	// TODO: clean up: this 'new' requires callers to do memory management
-	return new XMLNode(fDOMDocument->first_node());
+	return XMLNode(fDOMDocument->first_node());
 }
 
 //-----------------------------------------------------------------------------
diff --git a/src/XMLNode.cpp b/src/XMLNode.cpp
index 5e9d927..75985cc 100644
--- a/src/XMLNode.cpp
+++ b/src/XMLNode.cpp
@@ -38,22 +38,11 @@ using namespace astra;
 using namespace std;
 
 
-//-----------------------------------------------------------------------------
-// Utility function to delete a list of nodes
-static void deleteNodes(list<XMLNode*>& nodes)
-{
-	for (list<XMLNode*>::iterator i = nodes.begin(); i != nodes.end(); ++i)
-		delete (*i);
-
-	nodes.clear();
-}
-
-
 //-----------------------------------------------------------------------------
 // default constructor
 XMLNode::XMLNode() 
 {
-
+	fDOMElement = 0;
 }
 
 //-----------------------------------------------------------------------------	
@@ -79,14 +68,14 @@ void XMLNode::setDOMNode(xml_node<>* n)
 
 //-----------------------------------------------------------------------------	
 // print XML Node
-void XMLNode::print()
+void XMLNode::print() const
 {
 	std::cout << fDOMElement;
 }
 
 //-----------------------------------------------------------------------------	
 // print XML Node
-std::string XMLNode::toString()
+std::string XMLNode::toString() const
 {
 	std::string s;
 	::print(std::back_inserter(s), *fDOMElement, 0);
@@ -95,64 +84,61 @@ std::string XMLNode::toString()
 
 //-----------------------------------------------------------------------------	
 // Get single node
-XMLNode* XMLNode::getSingleNode(string name) 
+XMLNode XMLNode::getSingleNode(string name) const
 {
 	xml_node<> *node = fDOMElement->first_node(name.c_str());
 
-	if (node)
-		return new XMLNode(node);
-	else
-		return 0;
+	return XMLNode(node);
 }
 
 //-----------------------------------------------------------------------------	
 // Get list of nodes
-list<XMLNode*> XMLNode::getNodes(string name) 
+list<XMLNode> XMLNode::getNodes(string name) const
 {	
-	list<XMLNode*> result;
+	list<XMLNode> result;
 	xml_node<> *iter;
 	for (iter = fDOMElement->first_node(name.c_str()); iter; iter = iter->next_sibling(name.c_str())) {
-		result.push_back(new XMLNode(iter));
+		result.push_back(XMLNode(iter));
 	}
 	return result;
 }
 
 //-----------------------------------------------------------------------------	
 // Get list of nodes
-list<XMLNode*> XMLNode::getNodes() 
+list<XMLNode> XMLNode::getNodes() const
 {	
-	list<XMLNode*> result;
+	list<XMLNode> result;
 	xml_node<> *iter;
 	for (iter = fDOMElement->first_node(); iter; iter = iter->next_sibling()) {
-		result.push_back(new XMLNode(iter));
+		result.push_back(XMLNode(iter));
 	}
 	return result;
 }
 
 //-----------------------------------------------------------------------------	
 // Get name of this node
-std::string XMLNode::getName()
+std::string XMLNode::getName() const
 {
 	return fDOMElement->name();
 }
 
 //-----------------------------------------------------------------------------	
 // Get node content - STRING
-string XMLNode::getContent() 
+string XMLNode::getContent() const
 {
 	return fDOMElement->value();
 }
 
 //-----------------------------------------------------------------------------	
 // Get node content - NUMERICAL
-float32 XMLNode::getContentNumerical() 
+float32 XMLNode::getContentNumerical() const
 {
 	return boost::lexical_cast<float32>(getContent());
 }
 
 //-----------------------------------------------------------------------------	
 // Get node content - BOOLEAN
-bool XMLNode::getContentBool() 
+bool XMLNode::getContentBool() const
 {
 	string res = getContent();
 	return ((res == "1") || (res == "yes") || (res == "true") || (res == "on"));
@@ -160,21 +146,20 @@ bool XMLNode::getContentBool()
 
 //-----------------------------------------------------------------------------	
 // Get node content - STRING LIST
-vector<string> XMLNode::getContentArray()
+vector<string> XMLNode::getContentArray() const
 {
 	// get listsize
 	int iSize = boost::lexical_cast<int>(getAttribute("listsize"));
 	// create result array
 	vector<string> res(iSize);
 	// loop all list item nodes
-	list<XMLNode*> nodes = getNodes("ListItem");
-	for (list<XMLNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
-		int iIndex = (*it)->getAttributeNumerical("index");
-		string sValue = (*it)->getAttribute("value");
+	list<XMLNode> nodes = getNodes("ListItem");
+	for (list<XMLNode>::iterator it = nodes.begin(); it != nodes.end(); it++) {
+		int iIndex = it->getAttributeNumerical("index");
+		string sValue = it->getAttribute("value");
 		ASTRA_ASSERT(iIndex < iSize);
 		res[iIndex] = sValue;
 	}
-	deleteNodes(nodes);
 
 	// return 
 	return res;
@@ -182,7 +167,7 @@ vector<string> XMLNode::getContentArray()
 
 //-----------------------------------------------------------------------------	
 // Get node content - NUMERICAL LIST
-vector<float32> XMLNode::getContentNumericalArray()
+vector<float32> XMLNode::getContentNumericalArray() const
 {
 	// is scalar
 	if (!hasAttribute("listsize")) {
@@ -195,19 +180,18 @@ vector<float32> XMLNode::getContentNumericalArray()
 	// create result array
 	vector<float32> res(iSize);
 	// loop all list item nodes
-	list<XMLNode*> nodes = getNodes("ListItem");
-	for (list<XMLNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
-		int iIndex = (*it)->getAttributeNumerical("index");
-		float32 fValue = (*it)->getAttributeNumerical("value");
+	list<XMLNode> nodes = getNodes("ListItem");
+	for (list<XMLNode>::iterator it = nodes.begin(); it != nodes.end(); it++) {
+		int iIndex = it->getAttributeNumerical("index");
+		float32 fValue = it->getAttributeNumerical("value");
 		ASTRA_ASSERT(iIndex < iSize);
 		res[iIndex] = fValue;
 	}
-	deleteNodes(nodes);
 	// return 
 	return res;
 }
 
-vector<double> XMLNode::getContentNumericalArrayDouble()
+vector<double> XMLNode::getContentNumericalArrayDouble() const
 {
 	// is scalar
 	if (!hasAttribute("listsize")) {
@@ -220,21 +204,20 @@ vector<double> XMLNode::getContentNumericalArrayDouble()
 	// create result array
 	vector<double> res(iSize);
 	// loop all list item nodes
-	list<XMLNode*> nodes = getNodes("ListItem");
-	for (list<XMLNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
-		int iIndex = (*it)->getAttributeNumerical("index");
-		double fValue = (*it)->getAttributeNumericalDouble("value");
+	list<XMLNode> nodes = getNodes("ListItem");
+	for (list<XMLNode>::iterator it = nodes.begin(); it != nodes.end(); it++) {
+		int iIndex = it->getAttributeNumerical("index");
+		double fValue = it->getAttributeNumericalDouble("value");
 		ASTRA_ASSERT(iIndex < iSize);
 		res[iIndex] = fValue;
 	}
-	deleteNodes(nodes);
 	// return 
 	return res;
 }
 
 //-----------------------------------------------------------------------------	
 // Get node content - NUMERICAL LIST 2
-void XMLNode::getContentNumericalArray(float32*& _pfData, int& _iSize)
+void XMLNode::getContentNumericalArray(float32*& _pfData, int& _iSize) const
 {
 	// is scalar
 	if (!hasAttribute("listsize")) {
@@ -248,19 +231,18 @@ void XMLNode::getContentNumericalArray(float32*& _pfData, int& _iSize)
 	// create result array
 	_pfData = new float32[_iSize];
 	// loop all list item nodes
-	list<XMLNode*> nodes = getNodes("ListItem");
-	for (list<XMLNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
-		int iIndex = (*it)->getAttributeNumerical("index");
-		float32 fValue = (*it)->getAttributeNumerical("value");
+	list<XMLNode> nodes = getNodes("ListItem");
+	for (list<XMLNode>::iterator it = nodes.begin(); it != nodes.end(); it++) {
+		int iIndex = it->getAttributeNumerical("index");
+		float32 fValue = it->getAttributeNumerical("value");
 		ASTRA_ASSERT(iIndex < _iSize);
 		_pfData[iIndex] = fValue;
 	}
-	deleteNodes(nodes);
 }
 
 //-----------------------------------------------------------------------------	
 // Is attribute?
-bool XMLNode::hasAttribute(string _sName)
+bool XMLNode::hasAttribute(string _sName) const
 {
 	xml_attribute<> *attr = fDOMElement->first_attribute(_sName.c_str());
 	return (attr != 0);
@@ -268,7 +250,7 @@ bool XMLNode::hasAttribute(string _sName)
 
 //-----------------------------------------------------------------------------	
 // Get attribute - STRING
-string XMLNode::getAttribute(string _sName, string _sDefaultValue)
+string XMLNode::getAttribute(string _sName, string _sDefaultValue) const
 {
 	xml_attribute<> *attr = fDOMElement->first_attribute(_sName.c_str());
 
@@ -279,12 +261,12 @@ string XMLNode::getAttribute(string _sName, string _sDefaultValue)
 
 //-----------------------------------------------------------------------------	
 // Get attribute - NUMERICAL
-float32 XMLNode::getAttributeNumerical(string _sName, float32 _fDefaultValue)
+float32 XMLNode::getAttributeNumerical(string _sName, float32 _fDefaultValue) const
 {
 	if (!hasAttribute(_sName)) return _fDefaultValue;
 	return boost::lexical_cast<float32>(getAttribute(_sName));
 }
-double XMLNode::getAttributeNumericalDouble(string _sName, double _fDefaultValue)
+double XMLNode::getAttributeNumericalDouble(string _sName, double _fDefaultValue) const
 {
 	if (!hasAttribute(_sName)) return _fDefaultValue;
 	return boost::lexical_cast<double>(getAttribute(_sName));
@@ -292,7 +274,7 @@ double XMLNode::getAttributeNumericalDouble(string _sName, double _fDefaultValue
 
 //-----------------------------------------------------------------------------	
 // Get attribute - BOOLEAN
-bool XMLNode::getAttributeBool(string _sName, bool _bDefaultValue)
+bool XMLNode::getAttributeBool(string _sName, bool _bDefaultValue) const
 {
 	if (!hasAttribute(_sName)) return _bDefaultValue;
 	string res = getAttribute(_sName);
@@ -301,7 +283,7 @@ bool XMLNode::getAttributeBool(string _sName, bool _bDefaultValue)
 
 //-----------------------------------------------------------------------------	
 // Has option?
-bool XMLNode::hasOption(string _sKey) 
+bool XMLNode::hasOption(string _sKey) const
 {
 	xml_node<> *iter;
 	for (iter = fDOMElement->first_node("Option"); iter; iter = iter->next_sibling("Option")) {
@@ -314,7 +296,7 @@ bool XMLNode::hasOption(string _sKey)
 
 //-----------------------------------------------------------------------------	
 // Get option - STRING
-string XMLNode::getOption(string _sKey, string _sDefaultValue) 
+string XMLNode::getOption(string _sKey, string _sDefaultValue) const
 {
 	xml_node<> *iter;
 	for (iter = fDOMElement->first_node("Option"); iter; iter = iter->next_sibling("Option")) {
@@ -331,7 +313,7 @@ string XMLNode::getOption(string _sKey, string _sDefaultValue)
 
 //-----------------------------------------------------------------------------	
 // Get option - NUMERICAL
-float32 XMLNode::getOptionNumerical(string _sKey, float32 _fDefaultValue) 
+float32 XMLNode::getOptionNumerical(string _sKey, float32 _fDefaultValue) const
 {
 	if (!hasOption(_sKey)) return _fDefaultValue;
 	return boost::lexical_cast<float32>(getOption(_sKey));
@@ -339,7 +321,7 @@ float32 XMLNode::getOptionNumerical(string _sKey, float32 _fDefaultValue)
 
 //-----------------------------------------------------------------------------	
 // Get option - BOOL
-bool XMLNode::getOptionBool(string _sKey, bool _bDefaultValue)
+bool XMLNode::getOptionBool(string _sKey, bool _bDefaultValue) const
 {
 	bool bHasOption = hasOption(_sKey);
 	if (!bHasOption) return _bDefaultValue;
@@ -349,20 +331,18 @@ bool XMLNode::getOptionBool(string _sKey, bool _bDefaultValue)
 
 //-----------------------------------------------------------------------------	
 // Get option - NUMERICAL ARRAY
-vector<float32> XMLNode::getOptionNumericalArray(string _sKey)
+vector<float32> XMLNode::getOptionNumericalArray(string _sKey) const
 {
 	if (!hasOption(_sKey)) return vector<float32>();
 
-	list<XMLNode*> nodes = getNodes("Option");
-	for (list<XMLNode*>::iterator it = nodes.begin(); it != nodes.end(); it++) {
-		if ((*it)->getAttribute("key") == _sKey) {
-			vector<float32> vals = (*it)->getContentNumericalArray();
-			deleteNodes(nodes);
+	list<XMLNode> nodes = getNodes("Option");
+	for (list<XMLNode>::iterator it = nodes.begin(); it != nodes.end(); it++) {
+		if (it->getAttribute("key") == _sKey) {
+			vector<float32> vals = it->getContentNumericalArray();
 			return vals;
 		}
 	}
 
-	deleteNodes(nodes);
 	return vector<float32>();
 }
 
@@ -385,41 +365,40 @@ vector<float32> XMLNode::getOptionNumericalArray(string _sKey)
 
 //-----------------------------------------------------------------------------
 // Add child node - EMPTY
-XMLNode* XMLNode::addChildNode(string _sNodeName) 
+XMLNode XMLNode::addChildNode(string _sNodeName) 
 {
 	xml_document<> *doc = fDOMElement->document();
 	char *node_name = doc->allocate_string(_sNodeName.c_str());
 	xml_node<> *node = doc->allocate_node(node_element, node_name);
 	fDOMElement->append_node(node);
 
-	// TODO: clean up: this 'new' requires callers to do memory management
-	return new XMLNode(node);
+	return XMLNode(node);
 }
 
 //-----------------------------------------------------------------------------
 // Add child node - STRING
-XMLNode* XMLNode::addChildNode(string _sNodeName, string _sText) 
+XMLNode XMLNode::addChildNode(string _sNodeName, string _sText) 
 {
-	XMLNode* res = addChildNode(_sNodeName);
-	res->setContent(_sText);
+	XMLNode res = addChildNode(_sNodeName);
+	res.setContent(_sText);
 	return res;
 }
 
 //-----------------------------------------------------------------------------
 // Add child node - FLOAT
-XMLNode* XMLNode::addChildNode(string _sNodeName, float32 _fValue) 
+XMLNode XMLNode::addChildNode(string _sNodeName, float32 _fValue) 
 {
-	XMLNode* res = addChildNode(_sNodeName);
-	res->setContent(_fValue);
+	XMLNode res = addChildNode(_sNodeName);
+	res.setContent(_fValue);
 	return res;
 }
 
 //-----------------------------------------------------------------------------
 // Add child node - LIST
-XMLNode* XMLNode::addChildNode(string _sNodeName, float32* _pfList, int _iSize) 
+XMLNode XMLNode::addChildNode(string _sNodeName, float32* _pfList, int _iSize) 
 {
-	XMLNode* res = addChildNode(_sNodeName);
-	res->setContent(_pfList, _iSize);
+	XMLNode res = addChildNode(_sNodeName);
+	res.setContent(_pfList, _iSize);
 	return res;
 }
 
@@ -472,20 +451,18 @@ void XMLNode::addAttribute(string _sName, float32 _fValue)
 // Add option - STRING
 void XMLNode::addOption(string _sName, string _sText) 
 {
-	XMLNode* node = addChildNode("Option");
-	node->addAttribute("key", _sName);
-	node->addAttribute("value", _sText);
-	delete node;
+	XMLNode node = addChildNode("Option");
+	node.addAttribute("key", _sName);
+	node.addAttribute("value", _sText);
 }
 
 //-----------------------------------------------------------------------------	
 // Add option - FLOAT
 void XMLNode::addOption(string _sName, float32 _sText) 
 {
-	XMLNode* node = addChildNode("Option");
-	node->addAttribute("key", _sName);
-	node->addAttribute("value", _sText);
-	delete node;
+	XMLNode node = addChildNode("Option");
+	node.addAttribute("key", _sName);
+	node.addAttribute("value", _sText);
 }
 //-----------------------------------------------------------------------------	
 
-- 
cgit v1.2.3