//# BaseMappedArrayEngine.h: Abstract virtual column engine for virtual->stored mapping //# Copyright (C) 1995,1996,1997,1999,2001,2002 //# 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_BASEMAPPEDARRAYENGINE_H #define TABLES_BASEMAPPEDARRAYENGINE_H //# Includes #include #include #include #include namespace casacore { //# NAMESPACE CASACORE - BEGIN //# Forward Declarations template class ArrayColumn; class TableColumn; // // Templated virtual column engine for a table array of any type. // // // // // //# Classes you should understand before using this one. //
  • VirtualColumnEngine //
  • VirtualArrayColumn // // // BaseMappedArrayEngine contains for the 1-1 mapping of a virtual // column to a stored column (both containing arrays). // // // BaseMappedArrayEngine is an abstract base class for virtual column engines // which map data from the arrays in the virtual column to // the arrays in the stored column. Note the the stored column does not need // to be stored; it can be another virtual column, but usually it will be a // stored column. // Examples of classes using this base class are // ScaledArrayEngine and // RetypedArrayEngine. // // The virtual column has to be bound to the virtual column engine used // for it. The stored column will usually be bound to a storage manager, // but any other suitable data manager is possible. E.g. it is // possible to use MappedArrayEngine // to map a StokesVector to a float column, which in its turn uses // ScaledArrayEngine to store it as integers. // Note that the names of the virtual and stored column have to be different, // otherwise the table system cannot distinguish them. // // This base class does several tasks for the derived classes. // The main one is to keep and handle the information about the virtual // and stored column. The name of the stored column is written as a keyword // in the virtual column. In this way the stored column is known when // a table is read back. It also creates (RO)ArrayColumn // objects to access the stored column. The function roColumn gives // read access, while rwColumn gives write access. // // An engine object should be used for one column only, because the stored // column name is part of the engine. If it would be used for more than // one column, they would all share the same stored column. // When the engine is bound to a column, it is checked if the name // of that column matches the given virtual column name. // // The engine can be used for a column containing any kind of array // (thus direct or indirect, fixed or variable shaped)) as long as the // virtual array can be stored in the stored array. Thus a fixed shaped // virtual can use a variable shaped stored, but not vice versa. // A fixed shape indirect virtual can use a stored with direct arrays. // // The DataManager framework contains various virtual functions. // This class implements several, but not all of them. Furthermore // some implementations may not be optimal or correct for derived classes. // Hereafter follows a list of functions which may need implementation // in derived classes. The classes mentioned in the examples below show // implementations of these functions. //
      //
    • // The following (virtual) functions have to be implemented: //
      //
      // ~... (the destructor) // //
      // DataManager* clone() const; // //
      // String dataManagerType() const; // //
      // static void registerClass(); // //
      // static DataManager* makeObject (const String& dataManagerType); // //
      // void getArray (rownr_t rownr, Array& data); // //
      // void putArray (rownr_t rownr, const Array& data); // // (only if the virtual column is writable). //
      //
    • // For efficiency reasons it could be better to implement the following // functions: //
      //
      // void getSlice (rownr_t rownr, const Slicer& slicer, Array& data); // //
      // void putSlice (rownr_t rownr, const Slicer& slicer, // const Array& data); // //
      // void getArrayColumn (Array& data); // //
      // void putArrayColumn (const Array& data); // //
      // void getColumnSlice (const Slicer& slicer, Array& data); // //
      // void putColumnSlice (const Slicer& slicer, const Array& data); // //
      //
    • // The following functions have to be implemented when the shapes // of the virtual and stored arrays are not the same. //
      //
      // void setShapeColumn (const IPosition& shape); // //
      // void setShape (rownr_t rownr, const IPosition& shape); // //
      // uInt ndim (rownr_t rownr); // //
      // IPosition shape (rownr_t rownr); // //
      //
    • // The following functions deal with the initialization and persistence // of engine specific variables. When the class has variables of its // own, these functions may need to be implemented. Implementations of // create and prepare have to call the similar functions in this base class. //
      //
      // void close (AipsIO& ios); // //
      // void create64 (rownr_t nrrow); // //
      // void open64 (rownr_t nrrow, AipsIO& ios); // //
      // void prepare(); // //
      //
    • // The following functions do not need to be declared and implemented // in derived classes unless it is a very special case. //
      //
      // String dataManagerName() const; // //
      // Bool canAddRow() const; // //
      // Bool canRemoveRow() const; // //
      // void addRow64 (rownr_t nrrow); // //
      // void removeRow64 (rownr_t rownr); // //
      // DataManagerColumn* makeDirArrColumn (const String& columnName, // int dataType, // const String& dataTypeId); // //
      // DataManagerColumn* makeIndArrColumn (const String& columnName, // int dataType, // const String& dataTypeId); // //
      // Bool isWritable() const; // //
      // Bool isShapeDefined (rownr_t rownr); // //
      //
    //
    // // The derived classes // ScaledArrayEngine and // RetypedArrayEngine // are two examples of how to derive a class from this base class. // Note that ScaledArrayEngine does not need to implement functions // dealing with shapes, because it can use them from this base class. // On the other hand they need to be implemented in RetypedArrayEngine. // // // This base class implements several functions making the implementation // of derived classes simpler. Many details are implemented here, so often // only the basic mapping functions (get, put) need to be implemented // in a derived class. // // //
  • default constructor //
  • copy constructor //
  • assignment operator //
  • static String dataTypeId(); // unique name of the class // // //
  • Default constructor //
  • Copy constructor //
  • Assignment operator // template class BaseMappedArrayEngine : public VirtualColumnEngine, public VirtualArrayColumn { public: // Get the virtual column name. const String& virtualName() const; // Get the stored column name. const String& storedName() const; // The column is writable if the underlying stored column is writable. virtual Bool isWritable() const; protected: // Construct an engine to convert the virtual column to the stored column. // StoredColumnName is the name of the column where the converted // data will be put and must have data type StoredType. // The virtual column using this engine must have data type VirtualType. // By default the virtual column is assumed to be writable. // Use setWritable to unset it. BaseMappedArrayEngine (const String& virtualColumnName, const String& storedColumnName); // Destructor is mandatory. ~BaseMappedArrayEngine(); // The default constructor is required for reconstruction of the // engine when a table is read back. BaseMappedArrayEngine(); // Copy constructor is only used by copy constructor of derived classes. // (so it is made protected). BaseMappedArrayEngine (const BaseMappedArrayEngine&); // Set if the column is writable or not. void setWritable (Bool isWritable); // Set the virtual and stored column name. void setNames (const String& virtualName, const String& storedName); // Give access to the stored column. // This can be used by the derived classes to get/put data. inline ArrayColumn& column(); // Create the column object for the array column in this engine. // It will check if the given column name matches the virtual // column name. This assures that the engine is bound to the // correct column. virtual DataManagerColumn* makeIndArrColumn (const String& columnName, int dataType, const String& dataTypeId); // Initialize the object for a new table. // It defines a virtual column keyword telling the stored column name. // Initially the table has the given number of rows. // A derived class can have its own create function, but that should // always call this create function. virtual void create64 (rownr_t initialNrrow); // Preparing consists of setting the writable switch and // adding the initial number of rows in case of create. // It reads the stored column name from the virtual column keywords. // A derived class can have its own prepare function, but that should // always call this prepare function. virtual void prepare(); // Do the 2 stages of the prepare (define columns and adding rows). // void prepare1(); void prepare2(); // // Rows are added to the end of the table. // If the virtual column has FixedShape arrays and the stored not, // the shape in each stored row will be set. // This assures that the arrays are properly defined in each row, // so putSlice can be used without problems. //
    The second version is used by prepare2, because in case a column is // added to an already existing table, table.nrow() gives the existing // number of columns instead of 0. // virtual void addRow64 (rownr_t nrrow); virtual void addRowInit (rownr_t startRow, rownr_t nrrow); // // Set the shape of the FixedShape arrays in the column. // This function only gets called if the column has FixedShape arrays. // The shape gets saved and used to set the shape of the arrays // in the stored in case the stored has non-FixedShape arrays. // This implementation assumes the shape of virtual and stored arrays // are the same. If not, it has to be overidden in a derived class. virtual void setShapeColumn (const IPosition& shape); // Define the shape of the array in the given row. // It will define the shape of the (underlying) array. // This implementation assumes the shape of virtual and stored arrays // are the same. If not, it has to be overidden in a derived class. virtual void setShape (rownr_t rownr, const IPosition& shape); // Test if the (underlying) array is defined in the given row. virtual Bool isShapeDefined (rownr_t rownr); // Get the dimensionality of the (underlying) array in the given row. // This implementation assumes the dimensionality of virtual and // stored arrays are the same. If not, it has to be overidden in a // derived class. virtual uInt ndim (rownr_t rownr); // Get the shape of the (underlying) array in the given row. // This implementation assumes the shape of virtual and stored arrays // are the same. If not, it has to be overidden in a derived class. virtual IPosition shape (rownr_t rownr); // The data manager can handle changing the shape of an existing array // when the underlying stored column can do it. virtual Bool canChangeShape() const; // Make a table column object for the given column. // This has to be used in the create function, otherwise it could not // create a TableColumn object to store data in the column keywords. TableColumn makeTableColumn (const String& columnName); // Get an array in the given row. // This will scale and offset from the underlying array. virtual void getArray (rownr_t rownr, Array& array); // Put an array in the given row. // This will scale and offset to the underlying array. virtual void putArray (rownr_t rownr, const Array& array); // Get a section of the array in the given row. // This will scale and offset from the underlying array. virtual void getSlice (rownr_t rownr, const Slicer& slicer, Array& array); // Put into a section of the array in the given row. // This will scale and offset to the underlying array. virtual void putSlice (rownr_t rownr, const Slicer& slicer, const Array& array); // Get an entire column. // This will scale and offset from the underlying array. virtual void getArrayColumn (Array& array); // Put an entire column. // This will scale and offset to the underlying array. virtual void putArrayColumn (const Array& array); // Get some array values in the column. // This will scale and offset from the underlying array. virtual void getArrayColumnCells (const RefRows& rownrs, Array& data); // Put some array values in the column. // This will scale and offset to the underlying array. virtual void putArrayColumnCells (const RefRows& rownrs, const Array& data); // Get a section of all arrays in the column. // This will scale and offset from the underlying array. void getColumnSlice (const Slicer& slicer, Array& array); // Put a section of all arrays in the column. // This will scale and offset to the underlying array. void putColumnSlice (const Slicer& slicer, const Array& array); // Get a section of some arrays in the column. // This will scale and offset from the underlying array. virtual void getColumnSliceCells (const RefRows& rownrs, const Slicer& slicer, Array& data); // Put into a section of some arrays in the column. // This will scale and offset to the underlying array. virtual void putColumnSliceCells (const RefRows& rownrs, const Slicer& slicer, const Array& data); // Map the virtual shape to the stored shape. // By default is returns the virtual shape. virtual IPosition getStoredShape (rownr_t rownr, const IPosition& virtualShape); // Map the slicer for a virtual shape to a stored shape. // By default it returns the virtual input slicer. virtual Slicer getStoredSlicer (const Slicer& virtualSlicer) const; // Map StoredType array to VirtualType array. // This is meant when reading an array from the stored column. // The default implementation throws an exception. virtual void mapOnGet (Array& array, const Array& stored); // Map Bool array to bit flags array. // This is meant when writing an array into the stored column. // The default implementation throws an exception. virtual void mapOnPut (const Array& array, Array& stored); private: // Assignment is not needed and therefore forbidden // (so it is made private and not implemented). BaseMappedArrayEngine& operator= (const BaseMappedArrayEngine&); //# Now define the data members. String virtualName_p; //# virtual column name String storedName_p; //# stored column name Bool isWritable_p; //# is virtual column writable? Bool tempWritable_p; //# True = create phase, so column //# is temporarily writable //# False = asks stored column rownr_t initialNrrow_p; //# initial #rows in case of create Bool arrayIsFixed_p; //# True = virtual is FixedShape array IPosition shapeFixed_p; //# shape in case FixedShape array ArrayColumn* column_p; //# the stored column }; template inline const String& BaseMappedArrayEngine::virtualName() const { return virtualName_p; } template inline const String& BaseMappedArrayEngine::storedName() const { return storedName_p; } template inline void BaseMappedArrayEngine::setNames (const String& virtualName, const String& storedName) { virtualName_p = virtualName; storedName_p = storedName; } template inline void BaseMappedArrayEngine::setWritable (Bool isWritable) { isWritable_p = isWritable; } template inline ArrayColumn& BaseMappedArrayEngine::column() { return *column_p; } } //# NAMESPACE CASACORE - END #ifndef CASACORE_NO_AUTO_TEMPLATES #include #endif //# CASACORE_NO_AUTO_TEMPLATES #endif