RepXCollection& RepXUpgrader::upgradeCollection(RepXCollection& src)
	{
		RepXCollection* dest = NULL;
		const char* srcVersion = src.getVersion();
		if ( safeStrEq( src.getVersion(), RepXCollection::getLatestVersion() ) )
			return src;
		else
		{
			if ( safeStrEq( srcVersion, "1.0" ) || safeStrEq( srcVersion, "3.1" ) )
				dest = &upgrade10CollectionTo3_1Collection( src );
			else
				PX_ASSERT( false );
		}
		return *dest;
	}
	RepXCollection& RepXUpgrader::upgradeCollection(RepXCollection& src)
	{
		const char* srcVersion = src.getVersion();
		if( safeStrEq( srcVersion, RepXCollection::getLatestVersion() ))
           return src;		

		static const char* oldVersions[] = {"1.0",
											"3.1",
											"3.1.1",
											"3.2.0",
											"3.3.0",
											"3.3.1"
		};//should be increase order
		
		PxU32 grade = PX_MAX_U16;
		const PxU32 count = sizeof(oldVersions)/sizeof(oldVersions[0]);
		for (PxU32 i=0; i<count; i++)
	    {
			if( safeStrEq( srcVersion, oldVersions[i] ))
			{
				grade = i;
				break;
			}
		}

		typedef RepXCollection& (*UPGRADE_FUNCTION)(RepXCollection& src);

		UPGRADE_FUNCTION procs[count] = 
		{
			upgrade10CollectionTo3_1Collection,
			NULL,
			upgrade3_1CollectionTo3_2Collection,
			upgrade3_2CollectionTo3_3Collection,
			NULL,
			NULL
		};

		RepXCollection* dest = &src;
		for( PxU32 j = grade; j < count; j++ )
		{
			if( procs[j] )
				dest = &(procs[j])(*dest);
		}

		return *dest;
	}