casa  $Rev:20696$
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines
Public Member Functions | Private Member Functions | Private Attributes | Friends
casa::AttributeBuffer Class Reference

Buffer for storing Attributes. More...

#include <AttributeBuffer.h>

List of all members.

Public Member Functions

 AttributeBuffer ()
 Constructor of empty buffer.
 AttributeBuffer (const AttributeBuffer &other)
 Copy constructor.
const AttributeBufferoperator= (const AttributeBuffer &other)
 Assignement operator.
 ~AttributeBuffer ()
 Destructor.
Int nelements () const
 Return number of Attributes in the buffer.
void add (const AttributeBuffer &otherBuf)
 Define new Attributes.
void add (const Attribute &newAttribute, const Bool permanent=False)
void add (const String &name, const uInt newValue, const uInt tolerance=0, const Bool strict=False, const Bool permanent=False)
 Add new Attributes.
void add (const String &name, const Int newValue, const Int tolerance=0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, const Float newValue, const Float tolerance=0.0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, const Double newValue, const Double tolerance=0.0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, const Bool newValue, const Bool strict=False, const Bool permanent=False)
void add (const String &name, const String &newValue, const Bool strict=False, const Bool permanent=False)
void add (const String &name, const Quantity newValue, const Bool strict=False, const Bool permanent=False)
void add (const String &name, const Vector< uInt > &newValue, const uInt tolerance=0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, const Vector< Int > &newValue, const Int tolerance=0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, const Vector< Float > &newValue, const Float tolerance=0.0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, const Vector< Double > &newValue, const Double tolerance=0.0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, const Vector< Bool > &newValue, const Bool strict=False, const Bool permanent=False)
void add (const String &name, const Vector< String > &newValue, const Bool strict=False, const Bool permanent=False)
void add (const String &name, const Vector< Quantity > &newValue, const Bool strict=False, const Bool permanent=False)
void add (const String &name, uInt *newValue, const uInt tolerance=0, const Bool strict=False, const Bool permanent=False)
 Add new Attributes.
void add (const String &name, Int *newValue, const Int tolerance=0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, Float *newValue, const Float tolerance=0.0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, Double *newValue, const Double tolerance=0.0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, Bool *newValue, const Bool strict=False, const Bool permanent=False)
void add (const String &name, String *newValue, const Bool strict=False, const Bool permanent=False)
void add (const String &name, Quantity *newValue, const Bool strict=False, const Bool permanent=False)
void add (const String &name, Vector< uInt > *newValue, const uInt tolerance=0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, Vector< Int > *newValue, const Int tolerance=0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, Vector< Float > *newValue, const Float tolerance=0.0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, Vector< Double > *newValue, const Double tolerance=0.0, const Bool strict=False, const Bool permanent=False)
void add (const String &name, Vector< Bool > *newValue, const Bool strict=False, const Bool permanent=False)
void add (const String &name, Vector< String > *newValue, const Bool strict=False, const Bool permanent=False)
void add (const String &name, Vector< Quantity > *newValue, const Bool strict=False, const Bool permanent=False)
void set (const AttributeBuffer &otherBuf)
 Set the value of an Attribute.
void set (const Attribute &newAttribute)
void set (const String &name, const uInt newValue, const uInt tolerance=0, const Bool strict=False)
void set (const String &name, const Int newValue, const Int tolerance=0, const Bool strict=False)
void set (const String &name, const Float newValue, const Float tolerance=0.0, const Bool strict=False)
void set (const String &name, const Double newValue, const Double tolerance=0.0, const Bool strict=False)
void set (const String &name, const Bool newValue, const Bool strict=False)
void set (const String &name, const String &newValue, const Bool strict=False)
void set (const String &name, const Quantity newValue, const Bool strict=False)
void set (const String &name, const Vector< uInt > &newValue, const uInt tolerance=0, const Bool strict=False)
void set (const String &name, const Vector< Int > &newValue, const Int tolerance=0, const Bool strict=False)
void set (const String &name, const Vector< Float > &newValue, const Float tolerance=0.0, const Bool strict=False)
void set (const String &name, const Vector< Double > &newValue, const Double tolerance=0.0, const Bool strict=False)
void set (const String &name, const Vector< Bool > &newValue, const Bool strict=False)
void set (const String &name, const Vector< String > &newValue, const Bool strict=False)
void set (const String &name, const Vector< Quantity > &newValue, const Bool strict=False)
template<class T >
Bool getValue (const String &name, Vector< T > &value) const
 Get tha value of the named Attribute.
template<class T >
Bool getValue (const String &name, T &value) const
AttributegetAttribute (const String &name) const
 Get the pointer to the Attribute if it exists, else get 0.
AttributeValueBasegetAttributeValue (const String &name) const
 Get pointer to the AttributeValue if it exists, else get 0.
AttValue::ValueType getDataType (const String &name) const
 Get the data type of the Attribute.
Bool matches (const Attribute &res) const
 Function to see if Attribute res matches any Attribute in the AttributeBuffer *this.
Bool matches (const AttributeBuffer &resBuf) const
 Function to see if every Attribute in the AttributeBuffer resBuf matches every Attribute in the AttributeBuffer *this.
void operator+= (const AttributeBuffer &other)
 AttributeBuffer addition arithmetic.
void remove (const String &name)
 Remove Attributes from the AttributeBuffer.
void clear ()
Bool exists (const String &name) const
 Check if an Attribute with name name exists.
void addBuff (AttributeBuffer &other) const
 Add the Attributes of *this to other.
void setBuff (AttributeBuffer &other) const
 Set the Attributes of *this to other.

Private Member Functions

void addAttributeToBuffer (Attribute *newAttribute, const Bool permanent)
 Internal routine to add an Attribute to the Buffer.
Bool exists (const String &name, Int &found) const
 Check if an Attribute exists and return the index in the PtrBlock.
void erase ()
 Remove Attributes from the AttributeBuffer.

Private Attributes

PtrBlock< Attribute * > attributes
 PtrBlock for the Attributes.
Block< BoolnonDeletable
 Store if an Attribute is permamnent or not.

Friends

ostream & operator<< (ostream &, AttributeBuffer &)

Detailed Description

Buffer for storing Attributes.

Intended use:

Internal

Review Status

Date Reviewed:
yyyy/mm/dd

Prerequisite

Etymology

Buffer for storing Attributes

Synopsis

A number of classes in the Display Library have Attributes (ie. 'things' that have a name and a value). An AttributeBuffer can be used to store these Attributes internally and do some simple operations, like checking if a certain Attribute exists etc. An AttributeBuffer has a 'fat' interface for creating Attributes and getting the value of them that hides most of the type issues and should make it less work for a programmer to handle Attributes.

AttributeBuffers can be used for a number of things. First, of course, they can be used to store and organize information. For example, a class can store its state parameters in an AttributeBuffer for its own convenience. By creating a userinterface to its AttributeBuffer, a class can create a standard interface to its state. One possibility here is that by using Attributes that are constructed using a pointer (see AttributeValuePoi or AttributeValuePoiTol) and by defining a userinterface in the class to modify the Attributes of that class, one automatically creates a direct userinterface to (some of) the internal variables of that class. This is used for example in the WorldCanvas. Another point is that Attributes can be defined with arbitrary name and on several types, so if a class has a userinterface to its AttributeBuffer, a programmer who uses that class can define what information is stored in the class at run time. For example, if one can register an event handler in a class A, one can store information in class A using the Attribute interface of class A. The event handler knows where to look for the information (namely in the object of class A it is registered in) so it can find it, while the class A does not have to know what kind (name, type,...) information is needed by the event handler, but it can still store it.

Another use of AttributeBuffer is that one can use it to store the state of something. Later in the program the new state can be compared with the old state using the matches member function of AttributeBuffer and the appropriate action can be taken. This is for example used in the ImageDDImage to decide whether a cache should be flushed or not. AttributeBuffers match if all their Attributes match. For the logic of matching Attributes, see Attributes. An example may make this clearer:

    // We have an AttributeBuffer to store the old state:
    AttributeBuffer oldState;
    // and store some state information
    oldState.add("stateVar1", state1);
    oldState.add("stateVar2", state2);
    oldState.add("stateVar3", state3);
           .
           .
           .
    // later in the program we want to check if the current state matches the
    // old state
   
    // AttributeBuffer for the new state
    AttributeBuffer newState;
    // and store state (state1, state2 or state3 may have changed)
    newState.add("stateVar1", state1);
    newState.add("stateVar2", state2);
    newState.add("stateVar3", state3);
   
    // now the new an old state can be compared
    if { newState.matches(oldState) }
      use my cache
    } else {
      delete the cache and make new one
    }

A similar application of AttributeBuffers is the way they are used by the WorldCanvasHolder and the DisplayData (and Animator) to define what data is displayed on a canvas. To define what is displayed, one sets a number of Attributes on the WorldCanvasHolder (where they are called restrictions and they are stored in an AttributeBuffer) and possibly a number of Attributes on the DisplayData (where they are also called restrictions and also stored in an AttributeBuffer). Some DisplayData have already pre-defined restrictions (like the ImageDisplayData), but the program can add to these at run time. When a refresh of the WorldCanvas happens, only those data are displayed for which the buffer of the DisplayData matches that of the WorldCanvasHolder. This gives a very easy to use way of defining what is displayed, and this is how for example the Animator works (one simply changes some restrictions and do a refresh). See Animator for examples.

AttributeBuffers can also be used for passing information in a compact and generic way. This is used eg. by the WorldCanvasHolder in the sizeControl event handling. The WorldCanvasHolder does not have to know what information is passed and eg. what type it is. The code there looks like:

    Bool WorldCanvasHolder::sizeControlEH(WorldCanvas *wCanvas) 
   
      AttributeBuffer sizeControlAtts; 
   
       // rewind the List of DisplayDatas registered withe this WorldCanvasHolder
       displayListIter->toStart();
     
       // temp
       DisplayData *dData;
   
       // loop over DisplayDatas that are registered
       while ( !displayListIter->atEnd() ) {
         // get DisplayData from List and let this displaydata do its sizeControl
         dData = (DisplayData *) displayListIter->getRight();
         if ( !dData->sizeControl(*this, sizeControlAtts)) {
           // something is very wrong so abort refresh
           return False;
         }
         // next DisplayData
         displayListIter++;
       }
   
       // copy the Attributes set by the DisplayData to the WorldCanvas
       // We don't know what is being set, but we can still set it...\.
       wCanvas->setAttributes(sizeControlAtts);
   
       // things went ok
       return True;
     }  

Example

Motivation

For efficient handling of all the Attributes that a class in the Display Library can have, a buffer is needed, with an interface that makes handling of Attributes relatively easy.

Definition at line 192 of file AttributeBuffer.h.


Constructor & Destructor Documentation

Constructor of empty buffer.

Copy constructor.

Copy semantics.

Destructor.


Member Function Documentation

void casa::AttributeBuffer::add ( const AttributeBuffer otherBuf)

Define new Attributes.

If an Attribute of the same name exists, nothing happens. If permanent == True, the Attribute cannot be deleted from the Buffer.

void casa::AttributeBuffer::add ( const Attribute newAttribute,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
const uInt  newValue,
const uInt  tolerance = 0,
const Bool  strict = False,
const Bool  permanent = False 
)

Add new Attributes.

For type uInt, Int, Float and Double, the Attribute has tolerance (see AttributeValueTol), for Bool and String it has not (obviously). strict defines how Attribute match. See AttributeValue for the explanation of strict

void casa::AttributeBuffer::add ( const String name,
const Int  newValue,
const Int  tolerance = 0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
const Float  newValue,
const Float  tolerance = 0.0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
const Double  newValue,
const Double  tolerance = 0.0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
const Bool  newValue,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
const String newValue,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
const Quantity  newValue,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
const Vector< uInt > &  newValue,
const uInt  tolerance = 0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
const Vector< Int > &  newValue,
const Int  tolerance = 0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
const Vector< Float > &  newValue,
const Float  tolerance = 0.0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
const Vector< Double > &  newValue,
const Double  tolerance = 0.0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
const Vector< Bool > &  newValue,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
const Vector< String > &  newValue,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
const Vector< Quantity > &  newValue,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
uInt newValue,
const uInt  tolerance = 0,
const Bool  strict = False,
const Bool  permanent = False 
)

Add new Attributes.

These are the pointer versions. Using these members will create Attributes based on AttributeValueTol or AttributeValuePoiTol. This means that if the Attribute is modified, the variable used to define the Attribute also changes and vice versa.

void casa::AttributeBuffer::add ( const String name,
Int newValue,
const Int  tolerance = 0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
Float newValue,
const Float  tolerance = 0.0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
Double newValue,
const Double  tolerance = 0.0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
Bool newValue,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
String newValue,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
Quantity newValue,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
Vector< uInt > *  newValue,
const uInt  tolerance = 0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
Vector< Int > *  newValue,
const Int  tolerance = 0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
Vector< Float > *  newValue,
const Float  tolerance = 0.0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
Vector< Double > *  newValue,
const Double  tolerance = 0.0,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
Vector< Bool > *  newValue,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
Vector< String > *  newValue,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::add ( const String name,
Vector< Quantity > *  newValue,
const Bool  strict = False,
const Bool  permanent = False 
)
void casa::AttributeBuffer::addAttributeToBuffer ( Attribute newAttribute,
const Bool  permanent 
) [private]

Internal routine to add an Attribute to the Buffer.

Add the Attributes of *this to other.

void casa::AttributeBuffer::erase ( ) [private]

Remove Attributes from the AttributeBuffer.

Also erases Attributes that are permanent. Only used in operator=.

Bool casa::AttributeBuffer::exists ( const String name) const

Check if an Attribute with name name exists.

Referenced by casa::DisplayData::conformsToZIndex().

Bool casa::AttributeBuffer::exists ( const String name,
Int found 
) const [private]

Check if an Attribute exists and return the index in the PtrBlock.

Get the pointer to the Attribute if it exists, else get 0.

Get pointer to the AttributeValue if it exists, else get 0.

Get the data type of the Attribute.

template<class T >
Bool casa::AttributeBuffer::getValue ( const String name,
Vector< T > &  value 
) const

Get tha value of the named Attribute.

Returns True for success, and False for failure. This can happen if the caller asked for the wrong type.

Referenced by casa::DisplayData::conformsToZIndex().

template<class T >
Bool casa::AttributeBuffer::getValue ( const String name,
T &  value 
) const

Function to see if Attribute res matches any Attribute in the AttributeBuffer *this.

Function to see if every Attribute in the AttributeBuffer resBuf matches every Attribute in the AttributeBuffer *this.

Returns True if this is the case, returns False if for at least one Attribute in resBuf there is a mismatch.

Return number of Attributes in the buffer.

void casa::AttributeBuffer::operator+= ( const AttributeBuffer other)

AttributeBuffer addition arithmetic.

Go through *this buffer, and for those Attributes who have equivalents in other, sum the values.

const AttributeBuffer& casa::AttributeBuffer::operator= ( const AttributeBuffer other)

Assignement operator.

void casa::AttributeBuffer::remove ( const String name)

Remove Attributes from the AttributeBuffer.

Only works on Attributes that are not permanent

void casa::AttributeBuffer::set ( const AttributeBuffer otherBuf)

Set the value of an Attribute.

If the Attribute does not exist, it is created (using the corresponding add function with permanent set to False), otherwise the value of the existing Attribute, if it is of the correct type) will be changed. If the Attribute has a different type than the variable used in the set function, nothing happens (but I may change my mind and throw an exception).

void casa::AttributeBuffer::set ( const Attribute newAttribute)
void casa::AttributeBuffer::set ( const String name,
const uInt  newValue,
const uInt  tolerance = 0,
const Bool  strict = False 
)
void casa::AttributeBuffer::set ( const String name,
const Int  newValue,
const Int  tolerance = 0,
const Bool  strict = False 
)
void casa::AttributeBuffer::set ( const String name,
const Float  newValue,
const Float  tolerance = 0.0,
const Bool  strict = False 
)
void casa::AttributeBuffer::set ( const String name,
const Double  newValue,
const Double  tolerance = 0.0,
const Bool  strict = False 
)
void casa::AttributeBuffer::set ( const String name,
const Bool  newValue,
const Bool  strict = False 
)
void casa::AttributeBuffer::set ( const String name,
const String newValue,
const Bool  strict = False 
)
void casa::AttributeBuffer::set ( const String name,
const Quantity  newValue,
const Bool  strict = False 
)
void casa::AttributeBuffer::set ( const String name,
const Vector< uInt > &  newValue,
const uInt  tolerance = 0,
const Bool  strict = False 
)
void casa::AttributeBuffer::set ( const String name,
const Vector< Int > &  newValue,
const Int  tolerance = 0,
const Bool  strict = False 
)
void casa::AttributeBuffer::set ( const String name,
const Vector< Float > &  newValue,
const Float  tolerance = 0.0,
const Bool  strict = False 
)
void casa::AttributeBuffer::set ( const String name,
const Vector< Double > &  newValue,
const Double  tolerance = 0.0,
const Bool  strict = False 
)
void casa::AttributeBuffer::set ( const String name,
const Vector< Bool > &  newValue,
const Bool  strict = False 
)
void casa::AttributeBuffer::set ( const String name,
const Vector< String > &  newValue,
const Bool  strict = False 
)
void casa::AttributeBuffer::set ( const String name,
const Vector< Quantity > &  newValue,
const Bool  strict = False 
)

Set the Attributes of *this to other.


Friends And Related Function Documentation

ostream& operator<< ( ostream &  ,
AttributeBuffer  
) [friend]

Member Data Documentation

PtrBlock for the Attributes.

Should change this to a list

Definition at line 441 of file AttributeBuffer.h.

Store if an Attribute is permamnent or not.

Definition at line 444 of file AttributeBuffer.h.


The documentation for this class was generated from the following file: