//# TableRow.cc: Access to a table row //# Copyright (C) 1996,1997,1998,1999,2001 //# 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$ //# Includes #include #include #include #include #include #include #include #include #include #include #include #include namespace casacore { //# NAMESPACE CASACORE - BEGIN ROTableRow::ROTableRow() : itsRecord (0) { init(); } ROTableRow::ROTableRow (const Table& table, Bool storedColumnsOnly) : itsRecord (0) { init(); create (table, storedColumnsOnly, False); } ROTableRow::ROTableRow (const Table& table, const Vector& columnNames, Bool exclude) : itsRecord (0) { init(); create (table, columnNames, exclude, False); } ROTableRow::ROTableRow (const ROTableRow& that) : itsRecord (0) { init(); copy (that); } void ROTableRow::init() { itsLastRow = -1; itsReread = True; } ROTableRow::~ROTableRow() { deleteObjects(); } ROTableRow& ROTableRow::operator= (const ROTableRow& that) { copy (that); return *this; } void ROTableRow::copy (const ROTableRow& that) { if (this != &that) { deleteObjects(); itsTable = that.itsTable; itsNrused = that.itsNrused; itsLastRow = that.itsLastRow; itsReread = that.itsReread; if (that.itsRecord != 0) { makeObjects (that.itsRecord->description()); } } } Vector ROTableRow::columnNames() const { const RecordDesc& desc = itsRecord->description(); uInt nfield = desc.nfields(); Vector names(nfield); for (uInt i=0; idescription(); for (uInt i=0; i*)(itsColumns[i]); delete (RecordFieldPtr*)(itsFields[i]); break; case TpArrayBool: delete (ArrayColumn*)(itsColumns[i]); delete (RecordFieldPtr >*)(itsFields[i]); break; case TpUChar: delete (ScalarColumn*)(itsColumns[i]); delete (RecordFieldPtr*)(itsFields[i]); break; case TpArrayUChar: delete (ArrayColumn*)(itsColumns[i]); delete (RecordFieldPtr >*)(itsFields[i]); break; case TpShort: delete (ScalarColumn*)(itsColumns[i]); delete (RecordFieldPtr*)(itsFields[i]); break; case TpArrayShort: delete (ArrayColumn*)(itsColumns[i]); delete (RecordFieldPtr >*)(itsFields[i]); break; case TpInt: delete (ScalarColumn*)(itsColumns[i]); delete (RecordFieldPtr*)(itsFields[i]); break; case TpArrayInt: delete (ArrayColumn*)(itsColumns[i]); delete (RecordFieldPtr >*)(itsFields[i]); break; case TpUInt: delete (ScalarColumn*)(itsColumns[i]); delete (RecordFieldPtr*)(itsFields[i]); break; case TpArrayUInt: delete (ArrayColumn*)(itsColumns[i]); delete (RecordFieldPtr >*)(itsFields[i]); break; case TpInt64: delete (ScalarColumn*)(itsColumns[i]); delete (RecordFieldPtr*)(itsFields[i]); break; case TpArrayInt64: delete (ArrayColumn*)(itsColumns[i]); delete (RecordFieldPtr >*)(itsFields[i]); break; case TpFloat: delete (ScalarColumn*)(itsColumns[i]); delete (RecordFieldPtr*)(itsFields[i]); break; case TpArrayFloat: delete (ArrayColumn*)(itsColumns[i]); delete (RecordFieldPtr >*)(itsFields[i]); break; case TpDouble: delete (ScalarColumn*)(itsColumns[i]); delete (RecordFieldPtr*)(itsFields[i]); break; case TpArrayDouble: delete (ArrayColumn*)(itsColumns[i]); delete (RecordFieldPtr >*)(itsFields[i]); break; case TpComplex: delete (ScalarColumn*)(itsColumns[i]); delete (RecordFieldPtr*)(itsFields[i]); break; case TpArrayComplex: delete (ArrayColumn*)(itsColumns[i]); delete (RecordFieldPtr >*)(itsFields[i]); break; case TpDComplex: delete (ScalarColumn*)(itsColumns[i]); delete (RecordFieldPtr*)(itsFields[i]); break; case TpArrayDComplex: delete (ArrayColumn*)(itsColumns[i]); delete (RecordFieldPtr >*)(itsFields[i]); break; case TpString: delete (ScalarColumn*)(itsColumns[i]); delete (RecordFieldPtr*)(itsFields[i]); break; case TpArrayString: delete (ArrayColumn*)(itsColumns[i]); delete (RecordFieldPtr >*)(itsFields[i]); break; case TpRecord: delete (ScalarColumn*)(itsColumns[i]); delete (RecordFieldPtr*)(itsFields[i]); break; default: throw (TableError ("TableRow: unknown data type")); } itsTabCols[i] = 0; itsColumns[i] = 0; itsFields[i] = 0; } delete itsRecord; itsRecord = 0; } void ROTableRow::addColumnToDesc (RecordDesc& description, const TableColumn& column, Bool skipOther) { const ColumnDesc& columnDesc = column.columnDesc(); DataType dataType = columnDesc.dataType(); if (! (skipOther && dataType == TpOther)) { if (columnDesc.isArray()) { IPosition shape = column.shapeColumn(); if (shape.nelements() == 0) { shape = IPosition(1,-1); } description.addField (columnDesc.name(), dataType, shape); }else{ description.addField (columnDesc.name(), dataType); } itsNrused++; } } void ROTableRow::create (const Table& table, Bool storedColumnsOnly, Bool writable) { itsTable = table; // Loop through all columns in the table. // Add it to the RecordDesc when the column is writable or // when we do not need to write and when the column is stored // or no stored columns are asked for.. itsNrused = 0; RecordDesc description; uInt nrcol = itsTable.tableDesc().ncolumn(); for (uInt i=0; i& columnNames, Bool exclude, Bool writable) { itsTable = table; // Loop through all column names. // Always add it to the RecordDesc. itsNrused = 0; RecordDesc description; if (exclude) { makeDescExclude (description, columnNames, writable); }else{ uInt nrcol = columnNames.nelements(); for (uInt i=0; i& columnNames, Bool writable) { // Loop through all columns in the table. // Add it to the RecordDesc when the column is writable or // when we do not need to write. Skip the columns to exclude. uInt nrcol = itsTable.tableDesc().ncolumn(); uInt nrexcl = columnNames.nelements(); const TableDesc& tableDesc = itsTable.tableDesc(); for (uInt i=0; i(0)); itsColumns.resize (itsNrused, False, False); itsColumns.set (static_cast(0)); itsFields.resize (itsNrused, False, False); itsFields.set (static_cast(0)); itsDefined.resize (itsNrused, False, False); itsDefined.set (True); // Create the correct column object for each field. // (if not writing, an RO version is sufficient). // Also create a RecordFieldPtr object for each column. // This makes a fast data copy possible. uInt nrfield = description.nfields(); for (uInt i=0; i (itsTable, name); itsFields[i] = new RecordFieldPtr(*itsRecord, i); break; case TpUChar: itsColumns[i] = new ScalarColumn (itsTable, name); itsFields[i] = new RecordFieldPtr(*itsRecord, i); break; case TpShort: itsColumns[i] = new ScalarColumn (itsTable, name); itsFields[i] = new RecordFieldPtr(*itsRecord, i); break; case TpInt: itsColumns[i] = new ScalarColumn (itsTable, name); itsFields[i] = new RecordFieldPtr(*itsRecord, i); break; case TpUInt: itsColumns[i] = new ScalarColumn (itsTable, name); itsFields[i] = new RecordFieldPtr(*itsRecord, i); break; case TpInt64: itsColumns[i] = new ScalarColumn (itsTable, name); itsFields[i] = new RecordFieldPtr(*itsRecord, i); break; case TpFloat: itsColumns[i] = new ScalarColumn (itsTable, name); itsFields[i] = new RecordFieldPtr(*itsRecord, i); break; case TpDouble: itsColumns[i] = new ScalarColumn (itsTable, name); itsFields[i] = new RecordFieldPtr(*itsRecord, i); break; case TpComplex: itsColumns[i] = new ScalarColumn (itsTable, name); itsFields[i] = new RecordFieldPtr(*itsRecord, i); break; case TpDComplex: itsColumns[i] = new ScalarColumn (itsTable, name); itsFields[i] = new RecordFieldPtr(*itsRecord, i); break; case TpString: itsColumns[i] = new ScalarColumn (itsTable, name); itsFields[i] = new RecordFieldPtr(*itsRecord, i); break; case TpRecord: itsColumns[i] = new ScalarColumn (itsTable, name); itsFields[i] = new RecordFieldPtr(*itsRecord, i); break; case TpArrayBool: itsColumns[i] = new ArrayColumn (itsTable, name); itsFields[i] = new RecordFieldPtr >(*itsRecord, i); break; case TpArrayUChar: itsColumns[i] = new ArrayColumn (itsTable, name); itsFields[i] = new RecordFieldPtr >(*itsRecord, i); break; case TpArrayShort: itsColumns[i] = new ArrayColumn (itsTable, name); itsFields[i] = new RecordFieldPtr >(*itsRecord, i); break; case TpArrayInt: itsColumns[i] = new ArrayColumn (itsTable, name); itsFields[i] = new RecordFieldPtr >(*itsRecord, i); break; case TpArrayUInt: itsColumns[i] = new ArrayColumn (itsTable, name); itsFields[i] = new RecordFieldPtr >(*itsRecord, i); break; case TpArrayInt64: itsColumns[i] = new ArrayColumn (itsTable, name); itsFields[i] = new RecordFieldPtr >(*itsRecord, i); break; case TpArrayFloat: itsColumns[i] = new ArrayColumn (itsTable, name); itsFields[i] = new RecordFieldPtr >(*itsRecord, i); break; case TpArrayDouble: itsColumns[i] = new ArrayColumn (itsTable, name); itsFields[i] = new RecordFieldPtr >(*itsRecord, i); break; case TpArrayComplex: itsColumns[i] = new ArrayColumn (itsTable, name); itsFields[i] = new RecordFieldPtr >(*itsRecord, i); break; case TpArrayDComplex: itsColumns[i] = new ArrayColumn (itsTable, name); itsFields[i] = new RecordFieldPtr >(*itsRecord, i); break; case TpArrayString: itsColumns[i] = new ArrayColumn (itsTable, name); itsFields[i] = new RecordFieldPtr >(*itsRecord, i); break; default: throw (TableError ("TableRow: cannot handle Table " "and TableRecord yet")); } } } const TableRecord& ROTableRow::get (rownr_t rownr, Bool alwaysRead) const { // Only read when needed. if (Int64(rownr) == itsLastRow && !itsReread && !alwaysRead) { return *itsRecord; } const RecordDesc& desc = itsRecord->description(); Int ndim = 0; uInt nrfield = desc.nfields(); for (uInt i=0; i*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr*) itsFields[i])); break; case TpArrayBool: if (isDefined) { (*(const ArrayColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr >*) itsFields[i]), True); }else{ (*(RecordFieldPtr >*)(itsFields[i])).define ( Array (IPosition(ndim, 0))); } break; case TpUChar: (*(const ScalarColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr*) itsFields[i])); break; case TpArrayUChar: if (isDefined) { (*(const ArrayColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr >*) itsFields[i]), True); }else{ (*(RecordFieldPtr >*)(itsFields[i])).define ( Array (IPosition(ndim, 0))); } break; case TpShort: (*(const ScalarColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr*) itsFields[i])); break; case TpArrayShort: if (isDefined) { (*(const ArrayColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr >*) itsFields[i]), True); }else{ (*(RecordFieldPtr >*)(itsFields[i])).define ( Array (IPosition(ndim, 0))); } break; case TpInt: (*(const ScalarColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr*) itsFields[i])); break; case TpArrayInt: if (isDefined) { (*(const ArrayColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr >*) itsFields[i]), True); }else{ (*(RecordFieldPtr >*)(itsFields[i])).define ( Array (IPosition(ndim, 0))); } break; case TpUInt: (*(const ScalarColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr*) itsFields[i])); break; case TpArrayUInt: if (isDefined) { (*(const ArrayColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr >*) itsFields[i]), True); }else{ (*(RecordFieldPtr >*)(itsFields[i])).define ( Array (IPosition(ndim, 0))); } break; case TpInt64: (*(const ScalarColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr*) itsFields[i])); break; case TpArrayInt64: if (isDefined) { (*(const ArrayColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr >*) itsFields[i]), True); }else{ (*(RecordFieldPtr >*)(itsFields[i])).define ( Array (IPosition(ndim, 0))); } break; case TpFloat: (*(const ScalarColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr*) itsFields[i])); break; case TpArrayFloat: if (isDefined) { (*(const ArrayColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr >*) itsFields[i]), True); }else{ (*(RecordFieldPtr >*)(itsFields[i])).define ( Array (IPosition(ndim, 0))); } break; case TpDouble: (*(const ScalarColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr*) itsFields[i])); break; case TpArrayDouble: if (isDefined) { (*(const ArrayColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr >*) itsFields[i]), True); }else{ (*(RecordFieldPtr >*)(itsFields[i])).define ( Array (IPosition(ndim, 0))); } break; case TpComplex: (*(const ScalarColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr*) itsFields[i])); break; case TpArrayComplex: if (isDefined) { (*(const ArrayColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr >*) itsFields[i]), True); }else{ (*(RecordFieldPtr >*)(itsFields[i])).define ( Array (IPosition(ndim, 0))); } break; case TpDComplex: (*(const ScalarColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr*) itsFields[i])); break; case TpArrayDComplex: if (isDefined) { (*(const ArrayColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr >*) itsFields[i]), True); }else{ (*(RecordFieldPtr >*)(itsFields[i])).define ( Array (IPosition(ndim, 0))); } break; case TpString: (*(const ScalarColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr*) itsFields[i])); break; case TpArrayString: if (isDefined) { (*(const ArrayColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr >*) itsFields[i]), True); }else{ (*(RecordFieldPtr >*)(itsFields[i])).define ( Array (IPosition(ndim, 0))); } break; case TpRecord: (*(const ScalarColumn*)(itsColumns[i])).get ( rownr, *(*(RecordFieldPtr*) itsFields[i])); break; default: throw (TableError ("TableRow: unknown data type")); } } itsLastRow = rownr; itsReread = False; return *itsRecord; } // The values (might) have changed, which is not reflected in the // internal record. Be sure to reread when the same row is asked for. void ROTableRow::setReread (rownr_t rownr) { if (Int64(rownr) == itsLastRow) { itsReread = True; } } // put into column, convert if necessary #define PUTFIELD_ARRAY(type) \ do { \ try { \ (*(ArrayColumn*)(itsColumns[whichColumn])).put \ (rownr, record.asArray##type (whichField)); \ } \ catch (const AipsError & e) { \ (*(ArrayColumn*)(itsColumns[whichColumn])).put \ (rownr, record.toArray##type (whichField)); \ } \ } while (0) void ROTableRow::putField (rownr_t rownr, const TableRecord& record, Int whichColumn, Int whichField) { switch (itsRecord->description().type(whichColumn)) { case TpBool: (*(ScalarColumn*)(itsColumns[whichColumn])).put (rownr, record.asBool (whichField)); break; case TpArrayBool: PUTFIELD_ARRAY(Bool); break; case TpUChar: (*(ScalarColumn*)(itsColumns[whichColumn])).put (rownr, record.asuChar (whichField)); break; case TpArrayUChar: PUTFIELD_ARRAY(uChar); break; case TpShort: (*(ScalarColumn*)(itsColumns[whichColumn])).put (rownr, record.asShort (whichField)); break; case TpArrayShort: PUTFIELD_ARRAY(Short); break; case TpInt: (*(ScalarColumn*)(itsColumns[whichColumn])).put (rownr, record.asInt (whichField)); break; case TpArrayInt: PUTFIELD_ARRAY(Int); break; case TpUInt: (*(ScalarColumn*)(itsColumns[whichColumn])).put (rownr, record.asuInt (whichField)); break; case TpArrayUInt: PUTFIELD_ARRAY(uInt); break; case TpInt64: (*(ScalarColumn*)(itsColumns[whichColumn])).put (rownr, record.asInt64 (whichField)); break; case TpArrayInt64: PUTFIELD_ARRAY(Int64); break; case TpFloat: (*(ScalarColumn*)(itsColumns[whichColumn])).put (rownr, record.asfloat (whichField)); break; case TpArrayFloat: PUTFIELD_ARRAY(Float); break; case TpDouble: (*(ScalarColumn*)(itsColumns[whichColumn])).put (rownr, record.asdouble (whichField)); break; case TpArrayDouble: PUTFIELD_ARRAY(Double); break; case TpComplex: (*(ScalarColumn*)(itsColumns[whichColumn])).put (rownr, record.asComplex (whichField)); break; case TpArrayComplex: PUTFIELD_ARRAY(Complex); break; case TpDComplex: (*(ScalarColumn*)(itsColumns[whichColumn])).put (rownr, record.asDComplex (whichField)); break; case TpArrayDComplex: PUTFIELD_ARRAY(DComplex); break; case TpString: (*(ScalarColumn*)(itsColumns[whichColumn])).put (rownr, record.asString (whichField)); break; case TpArrayString: PUTFIELD_ARRAY(String); break; case TpRecord: (*(ScalarColumn*)(itsColumns[whichColumn])).put (rownr, record.subRecord (whichField)); break; default: throw (TableError ("TableRow: unknown data type")); } } void ROTableRow::putRecord (rownr_t rownr) { const RecordDesc& desc = itsRecord->description(); uInt nrfield = desc.nfields(); for (uInt i=0; i*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr*) itsFields[i]).get()); break; case TpArrayBool: (*(ArrayColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr >*) itsFields[i]).get()); break; case TpUChar: (*(ScalarColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr*) itsFields[i]).get()); break; case TpArrayUChar: (*(ArrayColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr >*) itsFields[i]).get()); break; case TpShort: (*(ScalarColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr*) itsFields[i]).get()); break; case TpArrayShort: (*(ArrayColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr >*) itsFields[i]).get()); break; case TpInt: (*(ScalarColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr*) itsFields[i]).get()); break; case TpArrayInt: (*(ArrayColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr >*) itsFields[i]).get()); break; case TpUInt: (*(ScalarColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr*) itsFields[i]).get()); break; case TpArrayUInt: (*(ArrayColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr >*) itsFields[i]).get()); break; case TpInt64: (*(ScalarColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr*) itsFields[i]).get()); break; case TpArrayInt64: (*(ArrayColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr >*) itsFields[i]).get()); break; case TpFloat: (*(ScalarColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr*) itsFields[i]).get()); break; case TpArrayFloat: (*(ArrayColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr >*) itsFields[i]).get()); break; case TpDouble: (*(ScalarColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr*) itsFields[i]).get()); break; case TpArrayDouble: (*(ArrayColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr >*) itsFields[i]).get()); break; case TpComplex: (*(ScalarColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr*) itsFields[i]).get()); break; case TpArrayComplex: (*(ArrayColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr >*) itsFields[i]).get()); break; case TpDComplex: (*(ScalarColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr*) itsFields[i]).get()); break; case TpArrayDComplex: (*(ArrayColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr >*) itsFields[i]).get()); break; case TpString: (*(ScalarColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr*) itsFields[i]).get()); break; case TpArrayString: (*(ArrayColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr >*) itsFields[i]).get()); break; case TpRecord: (*(ScalarColumn*)(itsColumns[i])).put (rownr, (*(RecordFieldPtr*) itsFields[i]).get()); break; default: throw (TableError ("TableRow: unknown data type")); } } // The values (might) have changed, which is not reflected in the // internal record. Be sure to reread when the same row is asked for. setReread (rownr); } TableRow::TableRow() : ROTableRow() {} TableRow::TableRow (const Table& table, Bool storedColumnsOnly) : ROTableRow() { if (! table.isWritable()) { throw (TableError ("TableRow cannot be used: table is not writable")); } create (table, storedColumnsOnly, True); } TableRow::TableRow (const Table& table, const Vector& columnNames, Bool exclude) : ROTableRow() { if (! table.isWritable()) { throw (TableError ("TableRow cannot be used: table is not writable")); } create (table, columnNames, exclude, True); } TableRow::TableRow (const TableRow& that) : ROTableRow() { copy (that); } TableRow::~TableRow() {} TableRow& TableRow::operator= (const TableRow& that) { copy (that); return *this; } void TableRow::putMatchingFields (rownr_t rownr, const TableRecord& record) { const RecordDesc& thisDesc = itsRecord->description(); const RecordDesc& thatDesc = record.description(); uInt nrfield = thatDesc.nfields(); Int field; for (uInt i=0; i= 0) { putField (rownr, record, field, i); } } // The values (might) have changed, which is not reflected in the // internal record. Be sure to reread when the same row is asked for. setReread (rownr); } void TableRow::put() { if (rowNumber() < 0) { throw (TableError ("TableRow::put(): no row read yet")); } put (rowNumber()); } void TableRow::put (rownr_t rownr, const TableRecord& record, Bool checkConformance) { if (checkConformance) { if (! namesConform (record)) { throw (TableError ("TableRow::put; names not conforming")); } } const RecordDesc& thisDesc = itsRecord->description(); uInt nrfield = thisDesc.nfields(); for (uInt i=0; i& valuesDefined, Bool checkConformance) { if (checkConformance) { if (! namesConform (record)) { throw (TableError ("TableRow::put; names not conforming")); } } const RecordDesc& thisDesc = itsRecord->description(); uInt nrfield = thisDesc.nfields(); AlwaysAssert (valuesDefined.nelements() >= nrfield, AipsError); for (uInt i=0; idescription(); const RecordDesc& thatDesc = that.description(); for (uInt i=0; i