text: #pragma once
  
  //---------------------------------------------------------------------------------------
  //
  //  *****************   Civilization IV   ********************
  //
  //  FILE:    CvArtFileMgr.h
  //
  //  AUTHOR:  Jesse Smith / Mustafa Thamer	9/2004
  //
  //  PURPOSE: Interfaces with Civ4ArtDefines.xml to manage the paths of art files
  //
  //---------------------------------------------------------------------------------------
  //  Copyright (c) 2004 Firaxis Games, Inc. All rights reserved.
  //---------------------------------------------------------------------------------------
  #ifndef CIV4_ARTFILEMGR_H
  #define CIV4_ARTFILEMGR_H
  
  // Class:			CvArtFileMgr
  // Purpose:		To Manage the Locations of Art Assets
  //
  // Adding a New Entry:
  //		*	Create a new ArtInfo<new> in 'CvInfos.h' & add to CyInfosInterface
  //		*	Add a new ART_INFO_DECL to 'CvArtFileMgr.h'
  //		*	Add a new ART_INFO_DEFN to 'CvArtFileMgr.cpp'
  //		*	Update Python 'CyGlobalContext & CyArtFileMgr' files
  //		*	Add INIT_GLOBAL_XML_LOAD item to SetGlobalArtDefines in 'CvXMLLoadUtilitySet'
  //		*	Add <new> to 'XML\Art\CIV4ArtDefines.xml' and update the 'CIV4ArtDefinesSchema'
  
  class CvArtInfoAsset;
  class CvArtInfoMisc;
  class CvArtInfoUnit;
  class CvArtInfoBuilding;
  class CvArtInfoCivilization;
  class CvArtInfoLeaderhead;
  class CvArtInfoBonus;
  class CvArtInfoImprovement;
  class CvArtInfoTerrain;
  class CvArtInfoFeature;
  class CvArtInfoMovie;
  class CvArtInfoInterface;
  
  // Example usage: ART_INFO_DECL(Unit)
  #define ART_INFO_DECL(name) \
  public: \
  	friend class Cv##name##ArtInfoItem; \
  	DllExport CvArtInfo##name##* get##name##ArtInfo(const char *szArtDefineTag) const; \
  	DllExport int getNum##name##ArtInfos() { return (int)m_pa##name##ArtInfo.size(); } \
  	DllExport std::vector<CvArtInfo##name##*>& get##name##ArtInfo() { return m_pa##name##ArtInfo; } \
  	DllExport CvArtInfo##name##& get##name##ArtInfo(int i); \
  private: \
  	typedef std::map<const char* /* index */,CvArtInfo##name##* /*value */, ltstr> ArtInfo##name##MapType; \
  	ArtInfo##name##MapType* m_map##name##ArtInfos; \
  	std::vector<CvArtInfo##name##*> m_pa##name##ArtInfo; \
  
  class CvArtFileMgr
  {
  private:
  	class ArtInfoItem
  	{
  	public:
  		ArtInfoItem() { CvArtFileMgr::GetInstance().addArtInfoItem(this); }
  		virtual void init() = 0;
  		virtual void deInit() = 0;
  		virtual void buildMap() = 0;
  	};
  public:
  	// singleton accessor
  	DllExport static CvArtFileMgr& GetInstance();
  
  	DllExport CvArtFileMgr() {};
  	DllExport virtual ~CvArtFileMgr() {};
  
  	DllExport void Init();
  	DllExport void DeInit();
  
  	// Deletes Maps, Reloads Infos from XML, Rebuilds Maps
  	DllExport void Reset();																														// Exposed to Python
  	
  	// Builds Maps
  	DllExport void buildArtFileInfoMaps();																							// Exposed to Python
  
  	// Adds an Art File List
  	void addArtInfoItem(CvArtFileMgr::ArtInfoItem* item) { m_artInfoItems.push_back(item);	}
  private:
  	struct ltstr
  	{
  		bool operator()(const char* s1, const char* s2) const
  		{
  			return strcmp(s1, s2) < 0;
  		}
  	};
  
  	ART_INFO_DECL(Asset);
  	ART_INFO_DECL(Misc);
  	ART_INFO_DECL(Unit);
  	ART_INFO_DECL(Building);
  	ART_INFO_DECL(Civilization);
  	ART_INFO_DECL(Leaderhead);
  	ART_INFO_DECL(Bonus);
  	ART_INFO_DECL(Improvement);
  	ART_INFO_DECL(Terrain);
  	ART_INFO_DECL(Feature);
  	ART_INFO_DECL(Movie);
  	ART_INFO_DECL(Interface);
  
  	std::vector<ArtInfoItem*> m_artInfoItems;
  };
  
  // Singleton Accessor
  #define ARTFILEMGR CvArtFileMgr::GetInstance()
  
  #endif
  