From 8f27e65bddd7d4b8515ce620fb485fdd78fcdf89 Mon Sep 17 00:00:00 2001 From: Constantin Jucovschi Date: Fri, 24 Apr 2009 07:20:22 -0400 Subject: Initial commit --- rasodmg/collection.hh | 224 ++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 224 insertions(+) create mode 100644 rasodmg/collection.hh (limited to 'rasodmg/collection.hh') diff --git a/rasodmg/collection.hh b/rasodmg/collection.hh new file mode 100644 index 0000000..d90eb39 --- /dev/null +++ b/rasodmg/collection.hh @@ -0,0 +1,224 @@ +/* +* This file is part of rasdaman community. +* +* Rasdaman community is free software: you can redistribute it and/or modify +* it under the terms of the GNU General Public License as published by +* the Free Software Foundation, either version 3 of the License, or +* (at your option) any later version. +* +* Rasdaman community 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 General Public License for more details. +* +* You should have received a copy of the GNU General Public License +* along with rasdaman community. If not, see . +* +* Copyright 2003, 2004, 2005, 2006, 2007, 2008, 2009 Peter Baumann / +rasdaman GmbH. +* +* For more information please see +* or contact Peter Baumann via . +/ +/** + * INCLUDE: collection.hh + * + * MODULE: rasodmg + * CLASS: r_Collection + * + * COMMENTS: + * None +*/ + +#ifndef _D_COLLECTION_ +#define _D_COLLECTION_ + +#include "raslib/error.hh" +#include "rasodmg/object.hh" + +template +class r_Iterator; + +//@ManMemo: Module: {\bf rasodmg} + +/*@Doc: + + Basic class of a collection. Possible subclasses are \Ref{r_Set}, + \Ref{r_Bag} and \Ref{r_List}. The protected members isOrdered and + allowsDuplicates are not initialized here, they have to be initialized + in the respective subclasses. + +*/ + +template +class r_Collection : public r_Object +{ + friend class r_Iterator; + + public: + /// default constructor + r_Collection() throw(r_Error); + /// copy constructor + r_Collection( const r_Collection& collection ) throw(r_Error); + /// virtual destructor + virtual ~r_Collection(); + + /// it is called when an object leaves transient memory + virtual void r_deactivate(); + + /// get number of elements + inline unsigned long cardinality() const; + + /// tells if the collection is empty or not + inline int is_empty() const; + /// tells if the collection is ordered or not + inline int is_ordered() const; + /// tells if the collections allowes duplicates or not + inline int allows_duplicates() const; + + /// asks about the containment of a specific element + int contains_element( const T& element ) const; + /// inserts an alement at the beginning + virtual void insert_element( const T& element, int no_modification = 0 ); + /** + The method inserts an element into the collection. If {\tt no_modification} + is set, the {\tt mark_modified()} method of r_Object is not invoked and, therefore, + a modification will not be recognized at the commit point. + */ + /// removes an element + virtual void remove_element( const T& element ); + /// removes all elements + void remove_all(); + + /// assignment operator + const r_Collection& operator=( const r_Collection& collection ); + + /// create an iterator pointing at the first element in the collection + r_Iterator create_iterator(); + + /// get base type schema + const r_Type* get_element_type_schema(); + + //@Man: Methods for database communication (internal use only): + //@{ + /// + + /// insert myself into the database + virtual void insert_obj_into_db(); + + /// inserts an object into a specific collection in the database + virtual void insert_obj_into_db( const char* ){;}; + /** + The method has no functionality in this class. It supposed to be removed in + future. + */ + + /// update myself + virtual void update_obj_in_db(); + + /// + //@} + + //@Man: Constructors/Methods for internal use only: + //@{ + /// + + /// constructor getting an internal collection representation + r_Collection( const void* node1 ); + /// + inline void* get_internal_representation() const; + /// + void set_internal_representation( const void* node1 ); + + /// + //@} + + protected: + /// + typedef struct CNode + { + CNode* next; + T* elem; + }; + + //@Man: Methods/Attributes for maintainance of removed objects + //@{ + /// + + /// create an iterator for removed objects + r_Iterator create_removed_iterator(); + + /// + /// pointer to list of removed elements + CNode* removed_objects; + + /// + //@} + + //@Man: Attributes storing some state information + //@{ + /// + /// + int isOrdered; + /// + int allowsDuplicates; + /// + unsigned long card; + /// + //@} + + // Normally, we would have used the following class to implement the + // internal structure of a r_Collection. But for RPC's sake, we use + // a simple structure. (RPC is not able to transfer C++ objects.) + // + // template + // class CNode + // { + // public: + // CNode(); + // CNode( const CNode& cnode ); + // ~CNode(); + // + // inline CNode* get_next() const; + // inline void set_next( const CNode& cnode ); + // inline T* get_elem() const; + // inline void set_elem( const T& element); + // + // private: + // CNode* next; + // T* elem; + // } + + //@Man: Methods for manipulating CNode lists + //@{ + /// + + /// + void add_node( CNode* &root, const T& element ); + /// + int remove_node( CNode* &root, const T& element ); + /// + void remove_all_nodes( CNode* &root ); + /// + void init_node_list( CNode* &root ); + + /// + //@} + + /// pointer to collection elements + CNode* coll; +}; + +#include "rasodmg/collection.icc" + +#ifdef EARLY_TEMPLATE +#ifdef __EXECUTABLE__ +#ifdef __VISUALC__ +#include "collection.cpp" +#else +#include "collection.cc" +#endif +#endif +#endif + +#endif -- cgit