00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013 #ifndef SST_CACHE_H
00014 #define SST_CACHE_H
00015
00016 #include <sst/core/debug.h>
00017
00018 namespace SST {
00019
00020 #define _CACHE_DBG( fmt, args...) __DBG( DBG_CACHE, Cache, fmt, ## args )
00021
00022 template <typename KeyT, typename DataT>
00023 class Cache {
00024
00025 static const int num_sets = 1024;
00026 static const int set_size = 1;
00027 static const unsigned int mask = num_sets - 1;
00028
00029 public:
00030 Cache( )
00031 {
00032 _CACHE_DBG("new\n");
00033 for ( int i = 0; i < num_sets * set_size; i++ ) {
00034 valid[ i] = false;
00035 data[i] = DataT();
00036 }
00037 }
00038
00039 void Inject( KeyT key, DataT _data ) {
00040 _CACHE_DBG( "key=%ld data=%#lx\n", (long int) key, (unsigned long) data );
00041 data[ key&mask ] = _data;
00042 valid[ key&mask ] = true;
00043 keys[ key&mask ] = key;
00044 _CACHE_DBG( "done\n" );
00045 }
00046
00047 void Invalidate( KeyT key ) {
00048 _CACHE_DBG( "key=%ld\n", (long int) key );
00049 valid[ key&mask ] = false;
00050 }
00051
00052 bool Read( KeyT key, DataT* _data ) {
00053 _CACHE_DBG( "key=%ld\n", (long int) key );
00054 *_data = data[ key&mask ];
00055 return valid[ key&mask ] && keys[ key&mask ] == key;
00056 }
00057 private:
00058
00059 friend class boost::serialization::access;
00060 template<class Archive>
00061 void serialize(Archive & ar, const unsigned int version )
00062 {
00063 _AR_DBG(Cache,"\n");
00064
00065
00066 for ( int i = 0; i < num_sets * set_size; i++ ) {
00067 if (!valid[i]) {
00068 data[i] = DataT();
00069 }
00070 }
00071 _AR_DBG(Cache," Begin\n");
00072 ar & BOOST_SERIALIZATION_NVP( keys );
00073 ar & BOOST_SERIALIZATION_NVP( data );
00074 ar & BOOST_SERIALIZATION_NVP( valid );
00075 _AR_DBG(Cache," Done\n");
00076 }
00077
00078 KeyT keys[ num_sets * set_size ];
00079 DataT data[ num_sets * set_size ];
00080 bool valid[ num_sets * set_size ];
00081 };
00082
00083 }
00084
00085 #endif // SST_CACHE_H