//---------------------------------------------------------------------
	void GpuProgramManager::saveMicrocodeCache( DataStreamPtr stream ) const
	{
		if (!stream->isWriteable())
		{
			OGRE_EXCEPT(Exception::ERR_CANNOT_WRITE_TO_FILE,
				"Unable to write to stream " + stream->getName(),
				"GpuProgramManager::saveMicrocodeCache");
		}
		
		// write the size of the array
		size_t sizeOfArray = mMicrocodeCache.size();
		stream->write(&sizeOfArray, sizeof(size_t));
		
		// loop the array and save it
		MicrocodeMap::const_iterator iter = mMicrocodeCache.begin();
		MicrocodeMap::const_iterator iterE = mMicrocodeCache.end();
		for ( ; iter != iterE ; iter++ )
		{
			// saves the name of the shader
			{
				const String & nameOfShader = iter->first;
				size_t stringLength = nameOfShader.size();
				stream->write(&stringLength, sizeof(size_t));				
				stream->write(&nameOfShader[0], stringLength);
			}
			// saves the microcode
			{
				const Microcode & microcodeOfShader = iter->second;
				size_t microcodeLength = microcodeOfShader->size();
				stream->write(&microcodeLength, sizeof(size_t));				
				stream->write(microcodeOfShader->getPtr(), microcodeLength);
			}
		}
	}
void FileSystemArchiveTests::testCreateAndRemoveFile()
{
	FileSystemArchive arch("./", "FileSystem");
	arch.load();

	CPPUNIT_ASSERT(!arch.isReadOnly());

	String fileName = "a_test_file.txt";
	DataStreamPtr stream = arch.create(fileName);

	String testString = "Some text here";
	size_t written = stream->write((void*)testString.c_str(), testString.size());
	CPPUNIT_ASSERT_EQUAL(testString.size(), written);

	stream->close();

	arch.remove(fileName);

	CPPUNIT_ASSERT(!arch.exists(fileName));

}