00001 #ifndef ITEM_CONTAINER_HH_ 00002 # define ITEM_CONTAINER_HH_ 00003 00004 # include <map> 00005 # include <iostream> 00006 00007 # include "objects_fwd.hh" 00008 00009 # define UNKNOWN_ITEM_CLASS (-1) 00010 00011 namespace objects 00012 { 00013 class ItemContainerFactory 00014 { 00015 public: 00016 ItemContainerFactory(); 00017 ~ItemContainerFactory(); 00018 00019 static ItemContainerFactory &get_instance(); 00020 const ItemContainer &get(int id); 00021 00022 protected: 00023 std::map<int, ItemContainer *> _item_container_map; 00024 00025 void register_item(ItemContainer &i); 00026 }; 00027 00028 class ItemContainer 00029 { 00030 public: 00031 typedef std::map<int, PossessedItem *> PossessedItemMap; 00032 00033 public: 00034 ItemContainer(); 00035 00036 static const ItemContainer &get(int id); 00037 virtual void accept(ItemVisitor &iv) = 0; 00038 virtual void print(std::ostream &os) = 0; 00039 00040 virtual int get_id() const = 0; 00041 virtual const std::string &get_name() = 0; 00042 00043 bool operator ==(const ItemContainer &i) const; 00044 00045 public: // Container specific. 00046 virtual int get_capacity() const = 0; 00047 int get_item_count() const; 00048 const PossessedItemMap &get_item_map() const; 00049 00050 // Add/remove/set slots. 00051 PossessedItem *get_item(int position); 00052 void set_item(int position, PossessedItem *pi); 00053 void remove_item(int position); 00054 00055 // Free slots. 00056 int get_next_free_slot() const; 00057 int get_free_slot_count() const; 00058 00059 protected: 00060 PossessedItemMap _item_map; 00061 }; 00062 00063 template<int ITEM_CONTAINER_ID, int CAPACITY> 00064 class DefItemContainer : public ItemContainer 00065 { 00066 public: 00067 DefItemContainer(); 00068 00069 static const int id = ITEM_CONTAINER_ID; 00070 00071 void accept(ItemVisitor &iv); 00072 int get_id() const; 00073 const std::string &get_name(); 00074 void print(std::ostream &os); 00075 00076 int get_capacity() const; 00077 }; 00078 00079 std::ostream &operator <<(std::ostream &os, const ItemContainer &ic); 00080 } 00081 00082 # include "item_container.hxx" 00083 00084 #endif