00001 #ifndef IOKERNEL__LIST_META_CLASS_H 00002 #define IOKERNEL__LIST_META_CLASS_H 00003 00004 #include "meta_class.h" 00005 #include "iokernel_forwarders.h" 00006 00007 struct GenericList { 00008 int count; 00009 Address space; 00010 }; 00011 00012 class ListMetaClass : public MetaClass { 00013 friend class ObjectFactory; 00014 public: 00015 ListMetaClass( LString metaClassName = LString() ); 00016 00017 virtual void write( const ObjectWrapper &obj, 00018 OutputStream* outputStream ) const; 00019 00020 virtual void read( const ObjectWrapper &obj, 00021 InputStream* inputStream ) const; 00022 00023 virtual Iterator* get_iterator( ConstAddress instance, 00024 Iterator::Contents contents = Iterator::Owned ) const; 00025 00026 virtual bool is_elementary() const; 00027 00028 virtual void initialize( const ObjectWrapper &obj, 00029 InputStream* inputStream ) const; 00030 00031 virtual void set_meta_class_of_object( Address address ) const; 00032 00033 virtual MetaClass* get_element_meta_class() const; 00034 00035 virtual VirtualNode* get_virtual_node( const LString &name, const String &what ) const; 00036 00037 virtual void set_element_meta_class( MetaClass* mc ); 00038 00039 virtual void destruct( const ObjectWrapper &obj, 00040 bool called_from_destructor ) const; 00041 00042 static void constructor_function( void* place ); 00043 00044 virtual void adjust_field_offsets(); 00045 00046 Walker::ApplyStatus walk(const Address address,Walker &walk) const; 00047 00048 static const LString &get_class_name(); 00049 00050 virtual void walk_referenced_meta_classes(MetaClassApplier *x); 00051 00052 protected: 00053 virtual void copy_over( Address target, GenericList* source ) const; 00054 00055 MetaClass* _element_meta_class; 00056 private: 00057 ListMetaClass(const ListMetaClass &); 00058 ListMetaClass &operator=(const ListMetaClass &); 00059 00060 }; 00061 00062 00063 // this is an abstract class 00064 class BaseListIterator : public Iterator { 00065 public: 00066 BaseListIterator( const MetaClass* element_meta_class ); 00067 00068 virtual const MetaClass* current_meta_class() const; 00069 00070 virtual const LString& current_name() const; 00071 00072 virtual bool is_valid() const; 00073 protected: 00074 bool _is_valid; 00075 const MetaClass* _element_meta_class; 00076 private: 00077 BaseListIterator(const BaseListIterator &); 00078 BaseListIterator &operator=(const BaseListIterator &); 00079 }; 00080 00081 00082 class ListIterator : public BaseListIterator { 00083 public: 00084 ListIterator( GenericList* glist, MetaClass* element_meta_class ); 00085 00086 virtual void* current() const; 00087 00088 virtual void next(); 00089 00090 virtual void previous(); 00091 00092 virtual void first(); 00093 00094 virtual void set_to( size_t index ); 00095 00096 virtual size_t length() const; 00097 00098 virtual Iterator *clone() const; 00099 00100 private: 00101 int currentIndex; 00102 GenericList* genericList; 00103 private: 00104 ListIterator(const ListIterator &); 00105 ListIterator &operator=(const ListIterator &); 00106 }; 00107 00108 00109 00110 00111 00112 00113 00114 00115 #endif