00001 #ifndef _OSL_RECORD_CHECK_DUPLICATE_H 00002 #define _OSL_RECORD_CHECK_DUPLICATE_H 00003 00004 #include "osl/basic_type.h" 00005 #include "osl/hashKey.h" 00006 #include "osl/pathEncoding.h" 00007 00008 #include <unordered_map> 00009 #include <deque> 00010 #include <vector> 00011 00012 namespace osl 00013 { 00014 namespace record 00015 { 00019 class CheckDuplicate 00020 { 00021 typedef std::unordered_map<HashKey, std::vector<PathEncoding>, std::hash<HashKey>> keymap_t; 00023 keymap_t keys; 00025 size_t regist_counter; 00027 size_t duplicated_hash_counter; 00029 size_t duplicated_moves_counter; 00030 00031 public: 00032 static std::pair<HashKey,PathEncoding> getLastState(const std::vector<Move>& moves); 00033 00037 enum DUPLICATE_RESULT 00038 { 00039 NO_DUPLICATE = 0, 00040 HASH_DUPLICATE = 1, 00041 MOVES_DUPLICATE = 2 00042 }; 00043 00047 CheckDuplicate() 00048 : regist_counter(0), 00049 duplicated_hash_counter(0), 00050 duplicated_moves_counter(0) 00051 {} 00052 00062 DUPLICATE_RESULT regist(const std::vector<Move>& moves); 00063 00067 void print(std::ostream& out) const; 00068 00072 size_t getRegists() const 00073 { return regist_counter; } 00074 00079 size_t getDuplicatedHash() const 00080 { return duplicated_hash_counter; } 00081 00085 size_t getDuplicatedMoves() const 00086 { return duplicated_moves_counter; } 00087 00088 private: 00098 DUPLICATE_RESULT regist(const HashKey& key, 00099 const PathEncoding& moves); 00100 }; 00101 00102 } // namespace record 00103 } // namespace osl 00104 00105 00106 #endif /* _OSL_RECORD_CHECK_DUPLICATE_H */ 00107 00108 // ;;; Local Variables: 00109 // ;;; mode:c++ 00110 // ;;; c-basic-offset:2 00111 // ;;; End: