//# ConcatScalarColumn.cc: A typed scalar column in a concatenated table //# Copyright (C) 2008 //# Associated Universities, Inc. Washington DC, USA. //# //# This library is free software; you can redistribute it and/or modify it //# under the terms of the GNU Library General Public License as published by //# the Free Software Foundation; either version 2 of the License, or (at your //# option) any later version. //# //# This library is distributed in the hope that it will be useful, but WITHOUT //# ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or //# FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public //# License for more details. //# //# You should have received a copy of the GNU Library General Public License //# along with this library; if not, write to the Free Software Foundation, //# Inc., 675 Massachusetts Ave, Cambridge, MA 02139, USA. //# //# Correspondence concerning AIPS++ should be addressed as follows: //# Internet email: aips2-request@nrao.edu. //# Postal address: AIPS++ Project Office //# National Radio Astronomy Observatory //# 520 Edgemont Road //# Charlottesville, VA 22903-2475 USA //# //# $Id$ #ifndef TABLES_CONCATSCALARCOLUMN_TCC #define TABLES_CONCATSCALARCOLUMN_TCC #include #include #include #include #include namespace casacore { //# NAMESPACE CASACORE - BEGIN template ConcatScalarColumn::ConcatScalarColumn (const BaseColumnDesc* bcdp, ConcatTable* reftab) : ConcatColumn (bcdp, reftab) {} template ConcatScalarColumn::~ConcatScalarColumn() {} template void ConcatScalarColumn::getScalarColumn (ArrayBase& arr) const { Vector& vec = static_cast&>(arr); rownr_t st = 0; for (uInt i=0; inrow(); Vector part = vec(Slice(st, nr)); refColPtr_p[i]->getScalarColumn (part); st += nr; } // Set the column cache to the first table. ///setColumnCache (0, refColPtr_p[0]->columnCache()); } template void ConcatScalarColumn::getScalarColumnCells (const RefRows& rownrs, ArrayBase& arr) const { Vector& vec = static_cast&>(arr); // Get the rownrs as a vector and sort it. // In this way the data will be read in sequential order. Vector rows = rownrs.convert(); Vector inx; GenSortIndirect::sort (inx, rows); const ConcatRows& ccRows = refTabPtr_p->rows(); rownr_t tabRownr; uInt tableNr=0; // Map each row to rownr and tablenr. // Note this is pretty fast because it is done in row order. for (rownr_t i=0; iget (tabRownr, &(vec[row])); } // Set the column cache to the last table used. ///setColumnCache (tableNr, refColPtr_p[tableNr]->columnCache()); } template void ConcatScalarColumn::putScalarColumn (const ArrayBase& arr) { Vector vec (static_cast&>(arr)); rownr_t st = 0; for (uInt i=0; inrow(); Vector part = vec(Slice(st, nr)); refColPtr_p[i]->putScalarColumn (part); st += nr; } // Set the column cache to the first table. ///setColumnCache (0, refColPtr_p[0]->columnCache()); } template void ConcatScalarColumn::putScalarColumnCells (const RefRows& rownrs, const ArrayBase& arr) { const Vector& vec = static_cast&>(arr); // Get the rownrs as a vector and sort it. // In this way the data will be read in sequential order. Vector rows = rownrs.convert(); Vector inx; GenSortIndirect::sort (inx, rows); const ConcatRows& ccRows = refTabPtr_p->rows(); rownr_t tabRownr; uInt tableNr=0; // Map each row to rownr and tablenr. // Note this is pretty fast because it is done in row order. for (rownr_t i=0; iput (tabRownr, &(vec[row])); } // Set the column cache to the last table used. ///setColumnCache (tableNr, refColPtr_p[tableNr]->columnCache()); } template void ConcatScalarColumn::makeSortKey (Sort& sortobj, CountedPtr& cmpObj, Int order, CountedPtr& dataSave) { //# Get the data as a column. Vector* vecPtr = new Vector(nrow()); dataSave = vecPtr; getScalarColumn (*vecPtr); fillSortKey (vecPtr, sortobj, cmpObj, order); } template void ConcatScalarColumn::makeRefSortKey (Sort& sortobj, CountedPtr& cmpObj, Int order, const Vector& rownrs, CountedPtr& dataSave) { //# Get the data as a column. Vector* vecPtr = new Vector(rownrs.size()); dataSave = vecPtr; getScalarColumnCells (rownrs, *vecPtr); fillSortKey (vecPtr, sortobj, cmpObj, order); } template void ConcatScalarColumn::fillSortKey (const Vector* vecPtr, Sort& sortobj, CountedPtr& cmpObj, Int order) { //# Pass the real vector storage as the sort data. //# Use the compare object if given, otherwise pass data type. //# Throw an exception if no compare function is given for //# an unknown data type. Bool deleteIt; const T* datap = vecPtr->getStorage (deleteIt); if (cmpObj.null()) { cmpObj = new ObjCompare(); } sortobj.sortKey (datap, cmpObj, sizeof(T), order == Sort::Descending ? Sort::Descending : Sort::Ascending); vecPtr->freeStorage (datap, deleteIt); } } //# NAMESPACE CASACORE - END #endif