00001 #ifndef ANP_DATAITEM_H
00002 #define ANP_DATAITEM_H
00003
00004
00005
00006
00007
00008
00009
00010 #include <iostream>
00011 #include <string>
00012 #include <vector>
00013
00014
00015 #include "Rtypes.h"
00016
00017 namespace Anp
00018 {
00019 template<class K, class D>
00020 class DataItem
00021 {
00022 public:
00023
00024 DataItem();
00025 DataItem(const K key_, const D data_);
00026 ~DataItem();
00027
00028 void Set(const K key_, const D data_);
00029 void SetData(const D data_);
00030 void SetKey(const K key_);
00031
00032 D Data() const;
00033 K Key() const;
00034
00035 private:
00036
00037 K key;
00038 D data;
00039 };
00040
00041 template<class K, class D>
00042 bool operator < (const DataItem<K, D> &lhs, const DataItem<K, D> &rhs);
00043
00044 template<class K, class D>
00045 bool operator < (const DataItem<K, D> &lhs, const K &rhs);
00046
00047 template<class K, class D>
00048 bool operator < (const K &lhs, const DataItem<K, D> &rhs);
00049
00050 template<class K, class D>
00051 bool operator == (const DataItem<K, D> &lhs, const DataItem<K, D> &rhs);
00052
00053 template<class K, class D>
00054 bool operator == (const DataItem<K, D> &lhs, const K &rhs);
00055
00056 template<class K, class D>
00057 bool operator == (const K &lhs, const DataItem<K, D> &rhs);
00058
00059
00060
00061
00062 typedef DataItem<std::string, Float_t> StringData;
00063 typedef DataItem<Short_t, Float_t> Data;
00064 typedef std::vector<Anp::Data> DataVec;
00065 typedef DataVec::const_iterator DataIter;
00066 typedef DataVec::iterator DataIterator;
00067
00068 std::ostream &operator<<(std::ostream& os, const Data &data);
00069
00070
00071
00072
00073 template<class K, class D> DataItem<K, D>::DataItem() {}
00074 template<class K, class D> DataItem<K, D>::DataItem(const K key_, const D data_)
00075 :key(key_),
00076 data(data_)
00077 {
00078 }
00079
00080 template<class K, class D> DataItem<K, D>::~DataItem() {}
00081
00082 template<class K, class D> void DataItem<K, D>::Set(const K key_, const D data_)
00083 {
00084 key = key_;
00085 data = data_;
00086 }
00087 template<class K, class D> void DataItem<K, D>::SetData(const D data_)
00088 {
00089 data = data_;
00090 }
00091 template<class K, class D> void DataItem<K, D>::SetKey(const K key_)
00092 {
00093 key = key_;
00094 }
00095
00096 template<class K, class D> D DataItem<K, D>::Data() const { return data; }
00097 template<class K, class D> K DataItem<K, D>::Key() const { return key; }
00098
00099
00100
00101
00102 template<class K, class D>
00103 inline bool operator < (const DataItem<K, D> &lhs, const DataItem<K, D> &rhs)
00104 {
00105 return (lhs.Key() < rhs.Key());
00106 }
00107
00108 template<class K, class D>
00109 inline bool operator < (const DataItem<K, D> &lhs, const K &rhs)
00110 {
00111 return (lhs.Key() < rhs);
00112 }
00113
00114 template<class K, class D>
00115 inline bool operator < (const K &lhs, const DataItem<K, D> &rhs)
00116 {
00117 return (lhs < rhs.Key());
00118 }
00119
00120 template<class K, class D>
00121 inline bool operator == (const DataItem<K, D> &lhs, const DataItem<K, D> &rhs)
00122 {
00123 return (lhs.Key() == rhs.Key());
00124 }
00125
00126 template<class K, class D>
00127 inline bool operator == (const DataItem<K, D> &lhs, const K &rhs)
00128 {
00129 return (lhs.Key() == rhs);
00130 }
00131
00132 template<class K, class D>
00133 inline bool operator == (const K &lhs, const DataItem<K, D> &rhs)
00134 {
00135 return (lhs == rhs.Key());
00136 }
00137
00138 inline std::ostream &operator<<(std::ostream& os, const Data &data)
00139 {
00140 os << "data[" << data.Key() << "]=" << data.Data();
00141 return os;
00142 }
00143 }
00144
00145 #endif