Index: /branches/egtra/ab5.0/abdev/BasicCompiler_Common/Debug.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/BasicCompiler_Common/Debug.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/BasicCompiler_Common/Debug.cpp	(revision 803)
@@ -276,9 +276,6 @@
 UserProc *GetSubFromObp(ULONG_PTR pos)
 {
-	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
-	while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+	foreach (auto pUserProc, compiler.GetObjectModule().meta.GetUserProcs())
 	{
-		UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
-
 		if(rva_to_real(pUserProc->GetBeginOpAddress()) <= pos  &&
 			pos < rva_to_real(pUserProc->GetEndOpAddress()))
Index: /branches/egtra/ab5.0/abdev/BasicCompiler_Common/Diagnose.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/BasicCompiler_Common/Diagnose.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/BasicCompiler_Common/Diagnose.cpp	(revision 803)
@@ -34,8 +34,6 @@
 		int codeSizeOfGlobalProc = 0;
 		int codeSizeOfClassMethod = 0;
-		compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
-		while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+		foreach (auto pUserProc, compiler.GetObjectModule().meta.GetUserProcs())
 		{
-			UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
 			if( pUserProc->IsCompiled() ){
 				if( pUserProc->HasParentClass() ){
@@ -60,11 +58,9 @@
 		int codeSizeOfEnum = 0;
 
-		// イテレータをリセット
-		compiler.GetObjectModule().meta.GetClasses().Iterator_Reset();
-
-		while( compiler.GetObjectModule().meta.GetClasses().Iterator_HasNext() ){
+		foreach (auto pClass, compiler.GetObjectModule().meta.GetClasses())
+		{
 			int codeSizeOfClass = 0;
 
-			CClass &objClass = *compiler.GetObjectModule().meta.GetClasses().Iterator_GetNext();
+			CClass &objClass = *pClass;
 
 			if( !objClass.IsEnum() ){
@@ -99,11 +95,9 @@
 		///////////////////////////////////////////////////////////////////
 
-		// イテレータをリセット
-		compiler.GetObjectModule().meta.GetClasses().Iterator_Reset();
-
-		while( compiler.GetObjectModule().meta.GetClasses().Iterator_HasNext() ){
+		foreach (auto pClass, compiler.GetObjectModule().meta.GetClasses())
+		{
 			int codeSizeOfClass = 0;
 
-			CClass &objClass = *compiler.GetObjectModule().meta.GetClasses().Iterator_GetNext();
+			CClass &objClass = *pClass;
 
 			// 動的メソッド
Index: /branches/egtra/ab5.0/abdev/BasicCompiler_Common/Subroutine.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/BasicCompiler_Common/Subroutine.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/BasicCompiler_Common/Subroutine.cpp	(revision 803)
@@ -319,8 +319,6 @@
 
 bool IsNeedProcCompile(){
-	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
-	while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
-	{
-		UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
+	foreach (auto pUserProc, compiler.GetObjectModule().meta.GetUserProcs())
+	{
 		if( pUserProc->IsUsing() && pUserProc->IsCompiled() == false ){
 			return true;
@@ -385,8 +383,6 @@
 
 repeat:
-	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
-	while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
-	{
-		UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
+	foreach (auto pUserProc, compiler.GetObjectModule().meta.GetUserProcs())
+	{
 		CompileBufferInProcedure( *pUserProc );
 	}
@@ -410,8 +406,6 @@
 			//プロシージャコンパイルによって、プロシージャコンパイルが必要になる場合
 
-			compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
-			while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+			foreach(auto pUserProc, compiler.GetObjectModule().meta.GetUserProcs())
 			{
-				UserProc *pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
 				CompileBufferInProcedure( *pUserProc );
 			}
Index: /branches/egtra/ab5.0/abdev/BasicCompiler_Common/VarList.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/BasicCompiler_Common/VarList.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/BasicCompiler_Common/VarList.cpp	(revision 803)
@@ -1,4 +1,5 @@
 #include "stdafx.h"
 
+#include <boost/range/algorithm.hpp>
 #include <Compiler.h>
 
@@ -411,15 +412,14 @@
 	if(pobj_dti->lplpSpBase[i2]==0) return;
 
-	UserProc *pUserProc = NULL;
-	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
-	while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+	auto const& t = compiler.GetObjectModule().meta.GetUserProcs();
+	auto it = boost::find_if<boost::return_found>(t, [&](UserProc *pUserProc) -> bool {
+		return rva_to_real(pUserProc->GetBeginOpAddress()) <= pobj_dti->lplpObp[i2] &&
+			pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->GetEndOpAddress());
+	});
+	if (it == boost::end(t))
 	{
-		pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
-		if(rva_to_real(pUserProc->GetBeginOpAddress()) <= pobj_dti->lplpObp[i2]  &&
-			pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->GetEndOpAddress())){
-			break;
-		}
-	}
-	if(!pUserProc) return;
+		return;
+	}
+	UserProc *pUserProc = *it;
 
 	foreach( Variable *pVar, pUserProc->GetLocalVars() ){
@@ -696,18 +696,16 @@
 	//プロシージャ コンボボックス
 	SendMessage(hProcCombo,CB_RESETCONTENT,0,0);
-	for(i2=pobj_dti->iProcLevel;i2>=0;i2--){
-
+	for(i2=pobj_dti->iProcLevel;i2>=0;i2--)
+	{
+		auto const& t = compiler.GetObjectModule().meta.GetUserProcs();
+		auto it = boost::find_if<boost::return_found>(t, [&](UserProc* p) {
+			return rva_to_real(p->GetBeginOpAddress()) <= pobj_dti->lplpObp[i2] &&
+				pobj_dti->lplpObp[i2] < rva_to_real(p->GetEndOpAddress());
+		});
 		UserProc *pUserProc = NULL;
-		compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
-		while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+		if (it != boost::end(t))
 		{
-			pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
-
-			if(rva_to_real(pUserProc->GetBeginOpAddress()) <= pobj_dti->lplpObp[i2]  &&
-				pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->GetEndOpAddress()))
-			{
-				lstrcpy(temporary,pUserProc->GetName().c_str());
-				break;
-			}
+			pUserProc = *it;
+			lstrcpy(temporary, pUserProc->GetName().c_str());
 		}
 		if(!pUserProc){
@@ -811,20 +809,15 @@
 	i2=pobj_dti->iProcLevel-i2;
 
-	if(pobj_dti->lplpSpBase[i2]){
-
-		UserProc *pUserProc = NULL;
-		compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
-		while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+	if(pobj_dti->lplpSpBase[i2])
+	{
+		auto const& t = compiler.GetObjectModule().meta.GetUserProcs();
+		auto it = boost::find_if<boost::return_found>(t, [&](UserProc* p) {
+			return rva_to_real(p->GetBeginOpAddress()) <= pobj_dti->lplpObp[i2] &&
+				pobj_dti->lplpObp[i2] < rva_to_real(p->GetEndOpAddress());
+		});
+
+		if (it != boost::end(t))
 		{
-			pUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
-
-			if(rva_to_real(pUserProc->GetBeginOpAddress()) <= pobj_dti->lplpObp[i2]  &&
-				pobj_dti->lplpObp[i2] < rva_to_real(pUserProc->GetEndOpAddress())){
-				break;
-			}
-		}
-
-		if(pUserProc){
-			compiler.StartProcedureCompile( pUserProc );
+			compiler.StartProcedureCompile(*it);
 		}
 	}
Index: /branches/egtra/ab5.0/abdev/BasicCompiler_Common/hash.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/BasicCompiler_Common/hash.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/BasicCompiler_Common/hash.cpp	(revision 803)
@@ -33,11 +33,9 @@
 
 	// ハッシュ値を取得
-	DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().GetHashArrayElement( simpleName );
-	while(pDllProc){
+	foreach (auto pDllProc, compiler.GetObjectModule().meta.GetDllProcs().GetHashArrayElement(simpleName))
+	{
 		if( pDllProc->IsEqualSymbol( LexicalAnalyzer::FullNameToSymbol( fullName ) ) ){
 			return pDllProc;
 		}
-
-		pDllProc=pDllProc->GetChainNext();
 	}
 
Index: /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Class.cpp	(revision 803)
@@ -1348,7 +1348,4 @@
 	delete pobj_LoopRefCheck;
 	pobj_LoopRefCheck=0;
-
-	// イテレータの準備
-	classes.Iterator_Init();
 }
 
@@ -1412,5 +1409,4 @@
 
 	compiler.GetObjectModule().meta.GetUserProcs().Put( pUserProc );
-	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Init();
 
 	LexicalAnalyzer::AddMethod(
Index: /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Const.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Const.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Const.cpp	(revision 803)
@@ -206,8 +206,4 @@
 		}
 	}
-
-	// イテレータを初期化
-	compiler.GetObjectModule().meta.GetGlobalConsts().Iterator_Init();
-	compiler.GetObjectModule().meta.GetGlobalConstMacros().Iterator_Init();
 }
 
Index: /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Delegate.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Delegate.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/LexicalAnalyzer_Delegate.cpp	(revision 803)
@@ -127,8 +127,7 @@
 	Jenga::Common::SourceTemplate sourceTemplate( ActiveBasic::Common::Environment::GetAbdevSystemDirPath() + "\\templates\\delegate_class.tab" );
 
-	delegates.Iterator_Reset();
-	while( delegates.Iterator_HasNext() )
-	{
-		const Delegate &dg = *delegates.Iterator_GetNext();
+	foreach (auto pDelegate, delegates)
+	{
+		const Delegate &dg = *pDelegate;
 
 		if( dg.IsExternal() )
@@ -263,9 +262,7 @@
 void LexicalAnalyzer::RefleshDelegatesParameterAndReturnType( Delegates &delegates )
 {
-	delegates.Iterator_Reset();
-	while( delegates.Iterator_HasNext() )
-	{
-		Delegate &dg = *delegates.Iterator_GetNext();
-		RefleshDelegateParameterAndReturnType( dg );
-	}
-}
+	foreach (auto *pDelegate, delegates)
+	{
+		RefleshDelegateParameterAndReturnType(*pDelegate);
+	}
+}
Index: /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Linker.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Linker.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/Linker.cpp	(revision 803)
@@ -257,9 +257,6 @@
 	nativeCode.PutEx( masterObjectModule.globalNativeCode );
 
-	masterObjectModule.meta.GetUserProcs().Iterator_Reset();
-	while( masterObjectModule.meta.GetUserProcs().Iterator_HasNext() )
-	{
-		const UserProc *pUserProc = masterObjectModule.meta.GetUserProcs().Iterator_GetNext();
-
+	foreach (auto pUserProc, masterObjectModule.meta.GetUserProcs())
+	{
 		if( pUserProc->GetNativeCode().GetSize() > 0 )
 		{
Index: /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/ProcedureGenerator.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/ProcedureGenerator.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/ProcedureGenerator.cpp	(revision 803)
@@ -18,7 +18,7 @@
 	int back_cp=cp;
 
-	classes.Iterator_Reset();
-	while(classes.Iterator_HasNext()){
-		CClass &objClass = *classes.Iterator_GetNext();
+	foreach(auto pClass, classes)
+	{
+		CClass &objClass = *pClass;
 		if( objClass.IsExternal() )
 		{
@@ -83,9 +83,7 @@
 	////////////////////////////////////////////////////////////////////
 
-	// イテレータをリセット
-	classes.Iterator_Reset();
-
-	while( classes.Iterator_HasNext() ){
-		const CClass &objClass = *classes.Iterator_GetNext();
+	foreach (auto pClass, classes)
+	{
+		const CClass &objClass = *pClass;
 
 		if( !objClass.IsUsing() ){
@@ -152,9 +150,7 @@
 	ChangeOpcode( temporary );
 
-	// イテレータをリセット
-	classes.Iterator_Reset();
-
-	while( classes.Iterator_HasNext() ){
-		const CClass &objClass = *classes.Iterator_GetNext();
+	foreach (auto pClass, classes)
+	{
+		const CClass &objClass = *pClass;
 
 		if( !objClass.IsUsing() ){
Index: /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/VtblGenerator.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/VtblGenerator.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/BasicCompiler_Common/src/VtblGenerator.cpp	(revision 803)
@@ -93,8 +93,6 @@
 void VtblGenerator::GenerateVTablesForAllClasses( Classes &classes )
 {
-	classes.Iterator_Reset();
-	while( classes.Iterator_HasNext() )
+	foreach (auto pClass, classes)
 	{
-		CClass *pClass = classes.Iterator_GetNext();
 		GenerateFullVTables( *pClass );
 
@@ -177,8 +175,6 @@
 void VtblGenerator::ActionVtblScheduleForAllClasses( Classes &classes, LONG_PTR ImageBase, LONG_PTR MemPos_CodeSection, LONG_PTR MemPos_DataSection )
 {
-	classes.Iterator_Reset();
-	while( classes.Iterator_HasNext() )
+	foreach(auto pClass, classes)
 	{
-		CClass *pClass = classes.Iterator_GetNext();
 		ActionVtblSchedule( *pClass, ImageBase, MemPos_CodeSection, MemPos_DataSection );
 
Index: /branches/egtra/ab5.0/abdev/ab-common-32.props
===================================================================
--- /branches/egtra/ab5.0/abdev/ab-common-32.props	(revision 802)
+++ /branches/egtra/ab5.0/abdev/ab-common-32.props	(revision 803)
@@ -10,5 +10,5 @@
     </ClCompile>
     <Link>
-      <AdditionalLibraryDirectories>..\..\jenga\lib\x86;..\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>$(SolutionDir)..\jenga\lib\x86;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
     </Link>
   </ItemDefinitionGroup>
Index: /branches/egtra/ab5.0/abdev/ab-common-64.props
===================================================================
--- /branches/egtra/ab5.0/abdev/ab-common-64.props	(revision 802)
+++ /branches/egtra/ab5.0/abdev/ab-common-64.props	(revision 803)
@@ -9,5 +9,5 @@
     </ClCompile>
     <Link>
-      <AdditionalLibraryDirectories>..\..\jenga\lib\x64;..\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
+      <AdditionalLibraryDirectories>..\..\jenga\lib\x64;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
     </Link>
   </ItemDefinitionGroup>
Index: /branches/egtra/ab5.0/abdev/ab-common.props
===================================================================
--- /branches/egtra/ab5.0/abdev/ab-common.props	(revision 802)
+++ /branches/egtra/ab5.0/abdev/ab-common.props	(revision 803)
@@ -7,5 +7,5 @@
   </PropertyGroup>
   <PropertyGroup>
-    <IntDir>$(SolutionDir)int\$(ProjectName)\$(Configuration)-$(Platform)\</IntDir>
+    <IntDir>$(SolutionDir)int\$(Configuration)-$(Platform)\$(ProjectName)\</IntDir>
   </PropertyGroup>
   <ItemDefinitionGroup>
@@ -21,7 +21,9 @@
       <ExceptionHandling>Async</ExceptionHandling>
       <PreprocessorDefinitions>WIN32;_SECURE_ATL=1;%(PreprocessorDefinitions)</PreprocessorDefinitions>
+      <AdditionalOptions>/Zm150 %(AdditionalOptions)</AdditionalOptions>
     </ClCompile>
     <Link>
       <GenerateDebugInformation>true</GenerateDebugInformation>
+      <AdditionalLibraryDirectories>$(SolutionDir)lib\$(PlatformShortName);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
     </Link>
   </ItemDefinitionGroup>
Index: /branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Class.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Class.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Class.cpp	(revision 803)
@@ -777,17 +777,16 @@
 
 	std::vector<const CClass *> classes;
-	const CClass *pClass = GetHashArrayElement( symbol.GetName().c_str() );
-	while( pClass )
-	{
-		if( pClass->IsEqualSymbol( symbol.GetNamespaceScopes(), symbol.GetName() ) ){
+	foreach (auto pClass, GetHashArrayElement(symbol.GetName()))
+	{
+		if ( pClass->IsEqualSymbol(symbol.GetNamespaceScopes(), symbol.GetName()))
+		{
 			//名前空間とクラス名が一致した
 			classes.push_back( pClass );
 		}
-		pClass = pClass->GetChainNext();
 	}
 	if( classes.size() > 0 )
 	{
 		// 複数の名前空間の中に同一のクラス名が存在する場合があるので、アクセス可能で尚且つ階層が一番深いものをチョイスする
-		pClass = classes.front();
+		auto pClass = classes.front();
 
 		foreach( const CClass *pTempClass, classes )
Index: /branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Const.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Const.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Const.cpp	(revision 803)
@@ -29,15 +29,10 @@
 CConst *Consts::GetObjectPtr( const Symbol &symbol )
 {
-	CConst *pConst = GetHashArrayElement( symbol.GetName().c_str() );
-	while( pConst )
-	{
-		if( pConst->IsEqualSymbol( symbol ) )
-		{
-			break;
-		}
-		pConst = pConst->GetChainNext();
-	}
-
-	return pConst;
+	auto c = GetHashArrayElement(symbol.GetName());
+	auto it = std::find_if(c.begin(), c.end(),
+		[&](CConst* t) {return t->IsEqualSymbol(symbol);});
+	return it != c.end()
+		? *it
+		: nullptr;
 }
 
@@ -131,14 +126,9 @@
 ConstMacro *ConstMacros::Find( const Symbol &symbol )
 {
-	ConstMacro *pConstMacro = GetHashArrayElement( symbol.GetName().c_str() );
-	while( pConstMacro )
-	{
-		if( pConstMacro->IsEqualSymbol( symbol ) )
-		{
-			break;
-		}
-		pConstMacro = pConstMacro->GetChainNext();
-	}
-
-	return pConstMacro;
+	auto c = GetHashArrayElement(symbol.GetName());
+	auto it = std::find_if(c.begin(), c.end(),
+		[&](ConstMacro* t) {return t->IsEqualSymbol(symbol);});
+	return it != c.end()
+		? *it
+		: nullptr;
 }
Index: /branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Meta.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Meta.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Meta.cpp	(revision 803)
@@ -46,8 +46,6 @@
 
 	// 関数・メソッド
-	meta.GetUserProcs().Iterator_Reset();
-	while( meta.GetUserProcs().Iterator_HasNext() )
-	{
-		UserProc *pUserProc = meta.GetUserProcs().Iterator_GetNext();
+	foreach (auto pUserProc, meta.GetUserProcs())
+	{
 		if( pUserProc->IsExternal() )
 		{
@@ -65,8 +63,6 @@
 
 	// DLL関数
-	meta.GetDllProcs().Iterator_Reset();
-	while( meta.GetDllProcs().Iterator_HasNext() )
-	{
-		DllProc *pDllProc = meta.GetDllProcs().Iterator_GetNext();
+	foreach (auto pDllProc, meta.GetDllProcs())
+	{
 		if( pDllProc->IsExternal() )
 		{
@@ -81,8 +77,6 @@
 
 	// クラス
-	meta.GetClasses().Iterator_Reset();
-	while( meta.GetClasses().Iterator_HasNext() )
-	{
-		CClass *pClass = meta.GetClasses().Iterator_GetNext();
+	foreach (auto pClass, meta.GetClasses())
+	{
 		if( pClass->IsExternal() )
 		{
@@ -132,8 +126,6 @@
 
 	// グローバル定数
-	meta.GetGlobalConsts().Iterator_Reset();
-	while( meta.GetGlobalConsts().Iterator_HasNext() )
-	{
-		CConst *pConst = meta.GetGlobalConsts().Iterator_GetNext();
+	foreach (auto pConst, meta.GetGlobalConsts())
+	{
 		if( pConst->IsExternal() )
 		{
@@ -148,8 +140,6 @@
 
 	// グローバル定数マクロ
-	meta.GetGlobalConstMacros().Iterator_Reset();
-	while( meta.GetGlobalConstMacros().Iterator_HasNext() )
-	{
-		ConstMacro *pConstMacro = meta.GetGlobalConstMacros().Iterator_GetNext();
+	foreach (auto pConstMacro, meta.GetGlobalConstMacros())
+	{
 		if( pConstMacro->IsExternal() )
 		{
@@ -200,8 +190,6 @@
 
 	// デリゲート
-	meta.GetDelegates().Iterator_Reset();
-	while( meta.GetDelegates().Iterator_HasNext() )
-	{
-		Delegate *pDelegate = meta.GetDelegates().Iterator_GetNext();
+	foreach (auto pDelegate, meta.GetDelegates())
+	{
 		if( pDelegate->IsExternal() )
 		{
@@ -218,15 +206,14 @@
 const ::Delegate &Meta::ToDelegate( const CClass &_class )
 {
-	const ::Delegate *dg = this->GetDelegates().GetHashArrayElement( _class.GetName().c_str() );
-	while( dg )
-	{
-		if( dg->IsEqualSymbol( _class.GetNamespaceScopes(), _class.GetName() ) ){
+	auto dg = this->GetDelegates().GetHashArrayElement(_class.GetName());
+	foreach (auto t, dg)
+	{
+		if( t->IsEqualSymbol( _class.GetNamespaceScopes(), _class.GetName() ) ){
 			//名前空間とクラス名が一致した
-			return *dg;
-		}
-		dg = dg->GetChainNext();
-	}
-
-	throw;
+			return *t;
+		}
+	}
+
+	throw std::runtime_error("Meta::ToDelegate");
 }
 
@@ -256,27 +243,18 @@
 {
 	// 関数・メソッド
-	this->GetUserProcs().Iterator_Init();
-	this->GetUserProcs().Iterator_Reset();
-	while( this->GetUserProcs().Iterator_HasNext() )
-	{
-		UserProc *pUserProc = this->GetUserProcs().Iterator_GetNext();
+	foreach (auto pUserProc, this->GetUserProcs())
+	{
 		pUserProc->Resolve( resolver, resolveErrors );
 	}
 
 	// DLL関数
-	this->GetDllProcs().Iterator_Init();
-	this->GetDllProcs().Iterator_Reset();
-	while( this->GetDllProcs().Iterator_HasNext() )
-	{
-		DllProc *pDllProc = this->GetDllProcs().Iterator_GetNext();
+	foreach (auto pDllProc, this->GetDllProcs())
+	{
 		pDllProc->Resolve( resolver, resolveErrors );
 	}
 
 	// クラス
-	this->GetClasses().Iterator_Init();
-	this->GetClasses().Iterator_Reset();
-	while( this->GetClasses().Iterator_HasNext() )
-	{
-		CClass *pClass = this->GetClasses().Iterator_GetNext();
+	foreach (auto pClass, this->GetClasses())
+	{
 		pClass->Resolve( resolver, resolveErrors );
 	}
@@ -289,18 +267,12 @@
 
 	// グローバル定数
-	this->GetGlobalConsts().Iterator_Init();
-	this->GetGlobalConsts().Iterator_Reset();
-	while( this->GetGlobalConsts().Iterator_HasNext() )
-	{
-		CConst *pConst = this->GetGlobalConsts().Iterator_GetNext();
+	foreach (auto pConst, this->GetGlobalConsts())
+	{
 		pConst->Resolve( resolver, resolveErrors );
 	}
 
 	// グローバル定数マクロ
-	this->GetGlobalConstMacros().Iterator_Init();
-	this->GetGlobalConstMacros().Iterator_Reset();
-	while( this->GetGlobalConstMacros().Iterator_HasNext() )
-	{
-		ConstMacro *pConstMacro = this->GetGlobalConstMacros().Iterator_GetNext();
+	foreach (auto pConstMacro, this->GetGlobalConstMacros())
+	{
 		pConstMacro->Resolve( resolver, resolveErrors );
 	}
@@ -325,9 +297,6 @@
 
 	// デリゲート
-	this->GetDelegates().Iterator_Init();
-	this->GetDelegates().Iterator_Reset();
-	while( this->GetDelegates().Iterator_HasNext() )
-	{
-		Delegate *pDelegate = this->GetDelegates().Iterator_GetNext();
+	foreach (auto pDelegate, this->GetDelegates())
+	{
 		pDelegate->Resolve( resolver, resolveErrors );
 	}
Index: /branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Procedure.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Procedure.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/ab_common/src/Lexical/Procedure.cpp	(revision 803)
@@ -243,6 +243,6 @@
 
 	// ハッシュ値を取得
-	UserProc *pUserProc = GetHashArrayElement( simpleName );
-	while(pUserProc){
+	foreach (auto pUserProc, GetHashArrayElement( simpleName ))
+	{
 		if( pUserProc->IsGlobalProcedure() ){
 			if( pUserProc->IsEqualSymbol( localSymbol ) ){
@@ -250,6 +250,4 @@
 			}
 		}
-
-		pUserProc=pUserProc->GetChainNext();
 	}
 }
Index: /branches/egtra/ab5.0/abdev/abdev/abdev.vcxproj
===================================================================
--- /branches/egtra/ab5.0/abdev/abdev/abdev.vcxproj	(revision 802)
+++ /branches/egtra/ab5.0/abdev/abdev/abdev.vcxproj	(revision 803)
@@ -114,5 +114,4 @@
       <DelayLoadDLLs>PSAPI.DLL;DWMAPI.DLL;%(DelayLoadDLLs)</DelayLoadDLLs>
       <SubSystem>Windows</SubSystem>
-      <TargetMachine>MachineX86</TargetMachine>
       <EntryPointSymbol>Startup_OldWindowsHelper</EntryPointSymbol>
     </Link>
@@ -152,5 +151,4 @@
       <AdditionalDependencies>comctl32.lib;imm32.lib;htmlhelp.lib;rpcrt4.lib;imagehlp.lib;tinyxmld_STL.lib;%(AdditionalDependencies)</AdditionalDependencies>
       <SubSystem>Windows</SubSystem>
-      <TargetMachine>MachineX64</TargetMachine>
       <EntryPointSymbol>
       </EntryPointSymbol>
@@ -194,5 +192,4 @@
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <TargetMachine>MachineX86</TargetMachine>
       <EntryPointSymbol>Startup_OldWindowsHelper</EntryPointSymbol>
     </Link>
@@ -235,5 +232,4 @@
       <OptimizeReferences>true</OptimizeReferences>
       <EnableCOMDATFolding>true</EnableCOMDATFolding>
-      <TargetMachine>MachineX64</TargetMachine>
       <EntryPointSymbol>
       </EntryPointSymbol>
Index: /branches/egtra/ab5.0/abdev/compiler.vcxproj
===================================================================
--- /branches/egtra/ab5.0/abdev/compiler.vcxproj	(revision 802)
+++ /branches/egtra/ab5.0/abdev/compiler.vcxproj	(revision 803)
@@ -117,5 +117,5 @@
       <SubSystem>Console</SubSystem>
       <StackReserveSize>4194304</StackReserveSize>
-      <EntryPointSymbol>mainStartup_OldWindowsHelper</EntryPointSymbol>
+      <EntryPointSymbol>Startup_OldWindowsHelper</EntryPointSymbol>
       <DelayLoadDLLs>PSAPI.DLL</DelayLoadDLLs>
     </Link>
Index: /branches/egtra/ab5.0/abdev/compiler_x64/MakePeHdr.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/compiler_x64/MakePeHdr.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/compiler_x64/MakePeHdr.cpp	(revision 803)
@@ -166,5 +166,4 @@
 			compiler.GetObjectModule().meta.GetDelegates()
 		);
-		compiler.GetObjectModule().meta.GetDelegates().Iterator_Init();
 
 		// デリゲートからクラスコードを生成
@@ -219,8 +218,4 @@
 	);
 
-	// サブルーチン（ユーザー定義、DLL関数）のイテレータの準備
-	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Init();
-	compiler.GetObjectModule().meta.GetDllProcs().Iterator_Init();
-
 
 	///////////////////////////
@@ -527,9 +522,6 @@
 		}
 	}
-	compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
-	while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
-	{
-		const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
-
+	foreach (auto const* pDllProc, compiler.GetObjectModule().meta.GetDllProcs() )
+	{
 		if( !pDllProc->IsUsing() ){
 			continue;
@@ -601,8 +593,6 @@
 			//辞書順にサーチ
 			temporary[0]=0;
-			compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
-			while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+			foreach (auto pTempUserProc, compiler.GetObjectModule().meta.GetUserProcs())
 			{
-				UserProc *pTempUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
 				if(pTempUserProc->IsExport()){
 					if(temporary[0]=='\0'){
@@ -707,9 +697,6 @@
 	int ImportDllNum=0;
 
-	compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
-	while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
-	{
-		const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
-
+	foreach (auto const* pDllProc, compiler.GetObjectModule().meta.GetDllProcs())
+	{
 		if( !pDllProc->IsUsing() ){
 			continue;
@@ -745,9 +732,6 @@
 		pImportDescriptor[i].Name=i*0x10;	//※すぐ下で再計算
 
-		compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
-		while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+		foreach (auto const* pDllProc, compiler.GetObjectModule().meta.GetDllProcs())
 		{
-			const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
-
 			if( !pDllProc->IsUsing() ){
 				continue;
@@ -782,9 +766,6 @@
 	pHintTable=(char *)HeapAlloc(hHeap,0,HintAllocSize);
 	for(i=0,i5=0;i<ImportDllNum;i++){
-		compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
-		while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+		foreach (auto pDllProc, compiler.GetObjectModule().meta.GetDllProcs())
 		{
-			DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
-
 			if( !pDllProc->IsUsing() ){
 				continue;
@@ -1071,9 +1052,6 @@
 			LookupSize;			//ルックアップテーブル
 
-		compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
-		while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+		foreach (auto const* pDllProc, compiler.GetObjectModule().meta.GetDllProcs())
 		{
-			const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
-
 			if( !pDllProc->IsUsing() ){
 				continue;
Index: /branches/egtra/ab5.0/abdev/compiler_x86/MakePeHdr.cpp
===================================================================
--- /branches/egtra/ab5.0/abdev/compiler_x86/MakePeHdr.cpp	(revision 802)
+++ /branches/egtra/ab5.0/abdev/compiler_x86/MakePeHdr.cpp	(revision 803)
@@ -176,5 +176,4 @@
 			compiler.GetObjectModule().meta.GetDelegates()
 		);
-		compiler.GetObjectModule().meta.GetDelegates().Iterator_Init();
 
 		// デリゲートからクラスコードを生成
@@ -229,9 +228,4 @@
 	);
 
-	// サブルーチン（ユーザー定義、DLL関数）のイテレータの準備
-	compiler.GetObjectModule().meta.GetUserProcs().Iterator_Init();
-	compiler.GetObjectModule().meta.GetDllProcs().Iterator_Init();
-
-
 
 	///////////////////////////
@@ -558,9 +552,6 @@
 		}
 	}
-	compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
-	while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
-	{
-		const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
-
+	foreach(auto pDllProc, compiler.GetObjectModule().meta.GetDllProcs())
+	{
 		if( !pDllProc->IsUsing() ){
 			continue;
@@ -631,8 +622,6 @@
 			//辞書順にサーチ
 			temporary[0]=0;
-			compiler.GetObjectModule().meta.GetUserProcs().Iterator_Reset();
-			while( compiler.GetObjectModule().meta.GetUserProcs().Iterator_HasNext() )
+			foreach(auto pTempUserProc, compiler.GetObjectModule().meta.GetUserProcs())
 			{
-				UserProc *pTempUserProc = compiler.GetObjectModule().meta.GetUserProcs().Iterator_GetNext();
 				if(pTempUserProc->IsExport()){
 					if(temporary[0]=='\0'){
@@ -723,9 +712,6 @@
 	int ImportDllNum=0;
 
-	compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
-	while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
-	{
-		const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
-
+	foreach (auto const* pDllProc, compiler.GetObjectModule().meta.GetDllProcs())
+	{
 		if( !pDllProc->IsUsing() ){
 			continue;
@@ -762,16 +748,14 @@
 		pImportTable[i].Name=i3+i*0x10;
 
-		compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
-		while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+		foreach (auto const *pDllProc, compiler.GetObjectModule().meta.GetDllProcs())
 		{
-			const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
-
-			if( !pDllProc->IsUsing() ){
+			if (!pDllProc->IsUsing())
+			{
 				continue;
 			}
-
-			if( pDllProc->GetDllFileName() == ppDllNames[i] ){
+			if (pDllProc->GetDllFileName() == ppDllNames[i])
+			{
 				//ルックアップデータのサイズを追加
-				LookupSize+=sizeof(DWORD);
+				LookupSize += sizeof (DWORD);
 			}
 		}
@@ -790,9 +774,6 @@
 	i3+=ImportDllNum*0x10;
 	for(i=0,i5=0;i<ImportDllNum;i++){
-		compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
-		while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+		foreach (auto pDllProc, compiler.GetObjectModule().meta.GetDllProcs())
 		{
-			DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
-
 			if( !pDllProc->IsUsing() ){
 				continue;
@@ -1075,9 +1056,6 @@
 			HintSize;			//ヒント名（関数名）テーブル
 
-		compiler.GetObjectModule().meta.GetDllProcs().Iterator_Reset();
-		while( compiler.GetObjectModule().meta.GetDllProcs().Iterator_HasNext() )
+		foreach (auto const* pDllProc, compiler.GetObjectModule().meta.GetDllProcs())
 		{
-			const DllProc *pDllProc = compiler.GetObjectModule().meta.GetDllProcs().Iterator_GetNext();
-
 			if( !pDllProc->IsUsing() ){
 				continue;
Index: /branches/egtra/ab5.0/jenga/include/common/Hashmap.h
===================================================================
--- /branches/egtra/ab5.0/jenga/include/common/Hashmap.h	(revision 802)
+++ /branches/egtra/ab5.0/jenga/include/common/Hashmap.h	(revision 803)
@@ -1,28 +1,46 @@
 #pragma once
-
+#include <unordered_set>
+#include <boost/range/algorithm.hpp>
+#include <boost/checked_delete.hpp>
+#include <boost/iterator/transform_iterator.hpp>
+#include <boost/cast.hpp>
 
 namespace Jenga{
 namespace Common{
 
+template<class T>
+class ObjectInHashmap;
+template<class T>
+struct ObjectInHashmapHash;
+template<class T>
+struct ObjectInHashmapEqualTo;
 
 #define MAX_HASHMAP 65535
-template<class T> class Hashmap
-{
-	T* hashArray[MAX_HASHMAP];
+template<class T> class Hashmap : boost::noncopyable
+{
+	typedef std::unordered_set<ObjectInHashmap<T>*, ObjectInHashmapHash<T>, ObjectInHashmapEqualTo<T>> MapType;
+	MapType map;
+
+	struct downcast
+	{
+		typedef T* result_type;
+		T* operator ()(ObjectInHashmap<T>* p) const
+		{
+			return boost::polymorphic_cast<T*>(p);
+		}
+	};
+	struct const_downcast
+	{
+		typedef T const* result_type;
+		T const* operator ()(ObjectInHashmap<T> const* p) const
+		{
+			return boost::polymorphic_cast<T const*>(p);
+		}
+	};
 
 public:
-	virtual int GetHash( const char *keyName ) const
-	{
-		int key;
-		for(key=0;*keyName!='\0';keyName++){
-			key=((key<<8)+ *keyName )%MAX_HASHMAP;
-		}
-		return key;
-	}
 
 	Hashmap()
-		: isIteratorReady( false )
-	{
-		memset( hashArray, 0, MAX_HASHMAP*sizeof(T*) );
+	{
 	}
 	~Hashmap()
@@ -32,13 +50,6 @@
 	void Clear()
 	{
-		for( int i=0; i<MAX_HASHMAP; i++ )
-		{
-			T* temp = hashArray[i];
-			if( temp )
-			{
-				delete temp;
-			}
-		}
-		memset( hashArray, 0, MAX_HASHMAP*sizeof(T*) );
+		boost::for_each(*this, boost::checked_deleter<T const>());
+		map.clear();
 	}
 
@@ -46,114 +57,52 @@
 	void PullOutAll()
 	{
-		memset( hashArray, 0, MAX_HASHMAP*sizeof(T*) );
-	}
-
-	bool Put( T* value )
-	{
-		int key = GetHash( value->GetKeyName().c_str() );
-
-		if(hashArray[key]){
-			T *temp = hashArray[key];
-			while( true ){
-				if( temp->IsDuplication( value ) )
-				{
-					// 重複している
-					return false;
-				}
-
-				if( temp->GetChainNext() == NULL )
-				{
-					break;
-				}
-				temp = temp->GetChainNext();
-			}
-			temp->SetChainNext( value );
-		}
-		else{
-			hashArray[key] = value;
-		}
-
-		return true;
-	}
-
-	T* GetHashArrayElement( const char *keyName )
-	{
-		return hashArray[GetHash(keyName)];
-	}
-	const T* GetHashArrayElement( const char *keyName ) const
-	{
-		return hashArray[GetHash(keyName)];
-	}
-
-	bool IsExistDuplicationKeyName( const std::string &keyName ) const
-	{
-		int key = GetHash( keyName.c_str() );
-
-		if(hashArray[key]){
-			const T *temp = hashArray[key];
-			while( true ){
-				if( temp->IsDuplication( keyName ) )
-				{
-					// 重複している
-					return true;
-				}
-
-				if( temp->GetChainNext() == NULL )
-				{
-					break;
-				}
-				temp = temp->GetChainNext();
-			}
-		}
-
-		return false;
+		map.clear();
+	}
+
+	bool Put(T* value)
+	{
+		if (value == nullptr)
+		{
+			throw std::invalid_argument("Hashmap::Put");
+		}
+		return map.insert(value).second;
+	}
+
+	typedef boost::transform_iterator<downcast, typename MapType::local_iterator> local_iterator;
+	typedef boost::transform_iterator<const_downcast, typename MapType::const_local_iterator> const_local_iterator;
+
+	boost::iterator_range<local_iterator> GetHashArrayElement(std::string const& keyName)
+	{
+		ObjectInHashmapDummy<T> t(keyName);
+		return boost::iterator_range<local_iterator>(
+			local_iterator(map.begin(map.bucket(&t)), downcast()),
+			local_iterator(map.end(map.bucket(&t)), downcast()));
+	}
+
+	boost::iterator_range<const_local_iterator> GetHashArrayElement(std::string const& keyName) const
+	{
+		ObjectInHashmapDummy<T> t(keyName);
+		return boost::iterator_range<const_local_iterator>(
+			const_local_iterator(map.begin(map.bucket(&t)), const_downcast()),
+			const_local_iterator(map.end(map.bucket(&t)), const_downcast()));
+	}
+
+	bool IsExistDuplicationKeyName(const std::string &keyName) const
+	{
+		ObjectInHashmapDummy<T> t(keyName);
+		return map.find(&t) != map.end();
 	}
 
 	bool IsExist( const T* value ) const
 	{
-		int key = GetHash( value->GetKeyName().c_str() );
-
-		if(hashArray[key]){
-			const T *temp = hashArray[key];
-			while( true ){
-				if( temp->IsDuplication( value ) )
-				{
-					// 重複している
-					return true;
-				}
-
-				if( temp->GetChainNext() == NULL )
-				{
-					break;
-				}
-				temp = temp->GetChainNext();
-			}
-		}
-
-		return false;
-	}
-
-	const T *FindLike( const T* value ) const
-	{
-		int key = GetHash( value->GetKeyName().c_str() );
-
-		if(hashArray[key]){
-			const T *temp = hashArray[key];
-			while( true ){
-				if( temp->IsDuplication( value ) )
-				{
-					// 重複している
-					return temp;
-				}
-
-				if( temp->GetChainNext() == NULL )
-				{
-					break;
-				}
-				temp = temp->GetChainNext();
-			}
-		}
-
-		return NULL;
+		return map.find(const_cast<T*>(value)) != map.end();
+	}
+
+	const T *FindLike( const ObjectInHashmap<T>* value ) const
+	{
+		auto it = map.find(const_cast<ObjectInHashmap<T>*>(value));
+		return it != map.end()
+			? boost::polymorphic_downcast<T const*>(*it)
+			: nullptr;
 	}
 
@@ -162,49 +111,25 @@
 	// イテレータ
 	/////////////////////////////////////////////////////////////////
-private:
-	mutable std::vector<T*> iterator_Objects;
-	mutable int iterator_CurrentNext;
-	mutable bool isIteratorReady;
-public:
-	void Iterator_Init() const
-	{
-		iterator_Objects.clear();
-		iterator_CurrentNext = 0;
-
-		for( int i=0; i<MAX_HASHMAP; i++ ){
-			if( hashArray[i] ){
-				T* temp = hashArray[i];
-				while( temp )
-				{
-					iterator_Objects.push_back( temp );
-
-					temp = (T*)temp->GetChainNext();
-				}
-			}
-		}
-
-		isIteratorReady = true;
-	}
-	void Iterator_Reset() const
-	{
-		if( !isIteratorReady )
-		{
-			Jenga::Throw( "イテレータの準備ができていない" );
-		}
-		iterator_CurrentNext = 0;
-	}
-	bool Iterator_HasNext() const
-	{
-		return ( iterator_CurrentNext < (int)iterator_Objects.size() );
-	}
-	T *Iterator_GetNext() const
-	{
-		return iterator_Objects[iterator_CurrentNext++];
-	}
-	int Iterator_GetMaxCount() const
-	{
-		return (int)iterator_Objects.size();
-	}
-
+	//typedef boost::transform_iterator<downcast, typename MapType::iterator> iterator;
+	typedef boost::transform_iterator<downcast, typename MapType::const_iterator> const_iterator;
+	typedef const_iterator iterator;
+	typedef typename MapType::size_type size_type;
+	typedef typename MapType::difference_type difference_type;
+	//iterator begin()
+	//{
+	//	return iterator(map.begin(), downcast());
+	//}
+	//iterator end()
+	//{
+	//	return iterator(map.end(), downcast());
+	//}
+	const_iterator begin() const
+	{
+		return const_iterator(map.begin(), downcast());
+	}
+	const_iterator end() const
+	{
+		return const_iterator(map.end(), downcast());
+	}
 
 	// XMLシリアライズ用
@@ -215,44 +140,25 @@
 	{
 		std::vector<T *> objects;
-		ar & BOOST_SERIALIZATION_NVP( objects );
-
-		// 読み込み後の処理
+		ar & BOOST_SERIALIZATION_NVP(objects);
 		Clear();
-		BOOST_FOREACH( T *object, objects )
-		{
-			Put( object );
-		}
-		Iterator_Init();
+		map = boost::copy_range<MapType>(objects);
 	}
 	template<class Archive> void save(Archive& ar, const unsigned int version) const
 	{
-		// 保存準備
-		std::vector<T *> objects;
-		objects.clear();
-		Iterator_Reset();
-		while( Iterator_HasNext() )
-		{
-			objects.push_back( Iterator_GetNext() );
-		}
-
-		ar & BOOST_SERIALIZATION_NVP( objects );
-	}
-};
-
-template<class T> class ObjectInHashmap
-{
-	T *pNextObject;
+		std::vector<T *> objects(begin(), end());
+		ar & BOOST_SERIALIZATION_NVP(objects);
+	}
+};
+
+template<class T>
+class ObjectInHashmap
+{
 public:
 
 	ObjectInHashmap()
-		: pNextObject( NULL )
 	{
 	}
 	~ObjectInHashmap()
 	{
-		if( pNextObject )
-		{
-			delete pNextObject;
-		}
 	}
 
@@ -266,16 +172,54 @@
 		return ( GetKeyName() == keyName );
 	}
-
-	T *GetChainNext()
-	{
-		return pNextObject;
-	}
-	const T *GetChainNext() const
-	{
-		return pNextObject;
-	}
-	void SetChainNext( T *pNextObject )
-	{
-		this->pNextObject = pNextObject;
+};
+
+template<class T>
+struct ObjectInHashmapHash
+{
+	typedef std::size_t result_type;
+	std::size_t operator ()(ObjectInHashmap<T> const* x) const
+	{
+		return std::hash<std::string>()(x->GetKeyName());
+	}
+};
+
+// GetHashArrayElementなどで文字列から検索するために用いる。
+template<class T>
+class ObjectInHashmapDummy : public ObjectInHashmap<T>, boost::noncopyable
+{
+public:
+	explicit ObjectInHashmapDummy(std::string const& s) : str(s) {}
+
+	virtual std::string const& GetKeyName() const override
+	{
+		return str;
+	}
+
+	virtual bool IsDuplication(T const* value) const override
+	{
+		return value != nullptr
+			&& value->ObjectInHashmap<T>::IsDuplication(str);
+	}
+
+private:
+	std::string const& str;
+};
+
+template<class T>
+struct ObjectInHashmapEqualTo
+{
+	typedef bool result_type;
+	bool operator ()(ObjectInHashmap<T> const* lhs, ObjectInHashmap<T> const* rhs) const
+	{
+		assert(lhs != nullptr);
+		assert(rhs != nullptr);
+		if (auto pl = dynamic_cast<T const*>(rhs))
+		{
+			return lhs->IsDuplication(pl);
+		}
+		else
+		{
+			return rhs->IsDuplication(dynamic_cast<T const*>(lhs));
+		}
 	}
 };
