aboutsummaryrefslogtreecommitdiffstats
path: root/src/base/songloading/songloader.cpp
diff options
context:
space:
mode:
authorAlexander Sulfrian <alexander@sulfrian.net>2010-03-29 07:30:52 +0200
committerAlexander Sulfrian <alexander@sulfrian.net>2013-01-05 17:17:47 +0100
commit15c0132fd080003f2bf47749e30e1f724b249341 (patch)
tree1d09f54e344d19e99df9e0fc89643f071881c6ae /src/base/songloading/songloader.cpp
parent0779a60f3e31a31db71614134ddd7eedc5e385d9 (diff)
downloadusdx-15c0132fd080003f2bf47749e30e1f724b249341.tar.gz
usdx-15c0132fd080003f2bf47749e30e1f724b249341.tar.xz
usdx-15c0132fd080003f2bf47749e30e1f724b249341.zip
dynamic registration of songloading_strategies with static template
Diffstat (limited to 'src/base/songloading/songloader.cpp')
-rw-r--r--src/base/songloading/songloader.cpp27
1 files changed, 11 insertions, 16 deletions
diff --git a/src/base/songloading/songloader.cpp b/src/base/songloading/songloader.cpp
index 2f3d3508..0524d18c 100644
--- a/src/base/songloading/songloader.cpp
+++ b/src/base/songloading/songloader.cpp
@@ -37,22 +37,10 @@ namespace usdx
Songloader::Songloader(void)
{
- // add different strategies to map
- strategies[L".txt"] = new SongloadingStrategyTxt();
- strategies[L".xml"] = new SongloadingStrategyXml();
- }
-
- void remove_element(std::pair<std::wstring, SongloadingStrategy*> e)
- {
- delete e.second;
- e.second = NULL;
}
Songloader::~Songloader(void)
{
- // clear memory for all elements in the map
- std::for_each(strategies.begin(), strategies.end(),
- remove_element);
strategies.clear();
// remove reference from singleton to make regeneration possible
@@ -71,24 +59,31 @@ namespace usdx
Song *Songloader::load_header(const boost::filesystem::wpath& filename)
{
std::wstring ext = extension(filename);
- std::map<std::wstring, SongloadingStrategy*>::iterator it = strategies.find(ext);
+ std::map<std::wstring, SongloadingStrategyBaseFactory*>::iterator it = strategies.find(ext);
if (it == strategies.end()) {
LOG4CXX_WARN(log, L"No SongloadingStrategy found for file extension: '" << ext << L"'");
throw NoStrategyException("Unknown file format.");
}
- return it->second->load_header(filename);
+ return it->second->get_songloader()->load_header(filename);
}
Song* Songloader::load_song(Song* song)
{
std::wstring ext = extension(song->get_filename());
- std::map<std::wstring, SongloadingStrategy*>::iterator it = strategies.find(ext);
+ std::map<std::wstring, SongloadingStrategyBaseFactory*>::iterator it = strategies.find(ext);
if (it == strategies.end()) {
LOG4CXX_WARN(log, L"No SongloadingStrategy found for file extension: '" << ext << L"'");
throw NoStrategyException("Unknown file format.");
}
- return it->second->load_song(song);
+ return it->second->get_songloader()->load_song(song);
+ }
+
+ void Songloader::add_strategy(SongloadingStrategyBaseFactory *factory)
+ {
+ if (factory) {
+ strategies[factory->get_fileextension()] = factory;
+ }
}
};