diff --git a/src/map.cpp b/src/map.cpp index 3a6a299..9ab40c2 100644 --- a/src/map.cpp +++ b/src/map.cpp @@ -17,7 +17,7 @@ namespace YAML for(node_map::const_iterator it=data.begin();it!=data.end();++it) { std::auto_ptr pKey = it->first->Clone(); std::auto_ptr pValue = it->second->Clone(); - m_data[pKey.release()] = pValue.release(); + AddEntry(pKey, pValue); } } @@ -104,8 +104,7 @@ namespace YAML pValue->Parse(pScanner, state); } - // assign the map with the actual pointers - m_data[pKey.release()] = pValue.release(); + AddEntry(pKey, pValue); } state.PopCollectionType(ParserState::BLOCK_MAP); @@ -149,8 +148,7 @@ namespace YAML else if(nextToken.type != Token::FLOW_MAP_END) throw ParserException(nextToken.mark, ErrorMsg::END_OF_MAP_FLOW); - // assign the map with the actual pointers - m_data[pKey.release()] = pValue.release(); + AddEntry(pKey, pValue); } state.PopCollectionType(ParserState::FLOW_MAP); @@ -173,8 +171,7 @@ namespace YAML pValue->Parse(pScanner, state); } - // assign the map with the actual pointers - m_data[pKey.release()] = pValue.release(); + AddEntry(pKey, pValue); state.PopCollectionType(ParserState::COMPACT_MAP); } @@ -188,12 +185,20 @@ namespace YAML // grab value pScanner->pop(); pValue->Parse(pScanner, state); - - // assign the map with the actual pointers - m_data[pKey.release()] = pValue.release(); + + AddEntry(pKey, pValue); state.PopCollectionType(ParserState::COMPACT_MAP); } + void Map::AddEntry(std::auto_ptr pKey, std::auto_ptr pValue) + { + node_map::const_iterator it = m_data.find(pKey.get()); + if(it != m_data.end()) + return; + + m_data[pKey.release()] = pValue.release(); + } + void Map::Write(Emitter& out) const { out << BeginMap; diff --git a/src/map.h b/src/map.h index bb8f949..bcfae4b 100644 --- a/src/map.h +++ b/src/map.h @@ -43,6 +43,8 @@ namespace YAML void ParseFlow(Scanner *pScanner, ParserState& state); void ParseCompact(Scanner *pScanner, ParserState& state); void ParseCompactWithNoKey(Scanner *pScanner, ParserState& state); + + void AddEntry(std::auto_ptr pKey, std::auto_ptr pValue); private: node_map m_data;