embeded traversal templates into Common.hpp

git-svn-id: https://projectm.svn.sourceforge.net/svnroot/projectm/personal/carm/represet@1157 6778bc44-b910-0410-a7a0-be141de4315d
This commit is contained in:
w1z7ard
2008-09-13 17:17:15 +00:00
parent 089bf87595
commit 7cdaa3d369
8 changed files with 77 additions and 94 deletions

View File

@ -1,68 +0,0 @@
#ifndef PROJECTM_ALGORITHMS_HPP
#define PROJECTM_ALGORITHMS_HPP
#include <cassert>
/// A collection of algorithms generically written over map style containers
namespace Algorithms
{
template <class TraverseFunctor, class Container>
void traverse(Container & container)
{
TraverseFunctor functor;
for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos)
{
assert(pos->second);
functor(pos->second);
}
}
template <class TraverseFunctor, class Container>
void traverseVector(Container & container)
{
TraverseFunctor functor;
for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos)
{
assert(*pos);
functor(*pos);
}
}
template <class TraverseFunctor, class Container>
void traverse(Container & container, TraverseFunctor & functor)
{
for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos)
{
assert(pos->second);
functor(pos->second);
}
}
namespace TraverseFunctors
{
template <class Data>
class DeleteFunctor
{
public:
void operator() (Data * data)
{
assert(data);
delete(data);
}
};
}
}
#endif

View File

@ -16,10 +16,8 @@
/* Loads a builtin function */
#include "BuiltinFuncs.hpp"
#include <string>
#include "Algorithms.hpp"
#include <iostream>
#include "fatal.h"
using namespace Algorithms;
std::map<std::string, Func*> BuiltinFuncs::builtin_func_tree;
@ -133,7 +131,7 @@ int BuiltinFuncs::init_builtin_func_db() {
Generally, do this on projectm exit */
int BuiltinFuncs::destroy_builtin_func_db() {
traverse<TraverseFunctors::DeleteFunctor<Func> >(builtin_func_tree);
traverse<TraverseFunctors::Delete<Func> >(builtin_func_tree);
builtin_func_tree.clear();

View File

@ -2,13 +2,11 @@
#include "fatal.h"
#include "BuiltinParams.hpp"
#include <cassert>
#include "Algorithms.hpp"
#include <iostream>
#include <algorithm>
#include "InitCondUtils.hpp"
#include <sstream>
using namespace Algorithms;
#include "Common.hpp"
BuiltinParams::BuiltinParams() {}
@ -106,7 +104,7 @@ std::transform(lowerName.begin(), lowerName.end(), lowerName.begin(), tolower);
int BuiltinParams::destroy_builtin_param_db()
{
Algorithms::traverse<TraverseFunctors::DeleteFunctor<Param> >(builtin_param_tree);
traverse<TraverseFunctors::Delete<Param> >(builtin_param_tree);
return PROJECTM_SUCCESS;
}

View File

@ -31,7 +31,6 @@
#include "PresetFrameIO.hpp"
#include "Param.hpp"
#include <map>
#include "Algorithms.hpp"
class BuiltinParams {
@ -69,8 +68,8 @@ public:
int insert_builtin_param( Param *param );
template <class Fun>
void traverse(Fun & fun) {
Algorithms::traverse(builtin_param_tree, fun);
void apply(Fun & fun) {
traverse(builtin_param_tree, fun);
}

View File

@ -28,7 +28,7 @@
#define COMMON_H
#include <stdarg.h>
#include <cassert>
#ifdef _MSC_VER
#define strcasecmp(s, t) _strcmpi(s, t)
#endif
@ -140,6 +140,64 @@ const std::string PROJECTM_FILE_EXTENSION("prjm");
const std::string MILKDROP_FILE_EXTENSION("milk");
const std::string PROJECTM_MODULE_EXTENSION("so");
template <class TraverseFunctor, class Container>
void traverse(Container & container)
{
TraverseFunctor functor;
for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos)
{
assert(pos->second);
functor(pos->second);
}
}
template <class TraverseFunctor, class Container>
void traverseVector(Container & container)
{
TraverseFunctor functor;
for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos)
{
assert(*pos);
functor(*pos);
}
}
template <class TraverseFunctor, class Container>
void traverse(Container & container, TraverseFunctor & functor)
{
for (typename Container::iterator pos = container.begin(); pos != container.end(); ++pos)
{
assert(pos->second);
functor(pos->second);
}
}
namespace TraverseFunctors
{
template <class Data>
class Delete
{
public:
void operator() (Data * data)
{
assert(data);
delete(data);
}
};
}
inline std::string parseExtension(const std::string & filename) {

View File

@ -34,9 +34,7 @@
#include "ParamUtils.hpp"
#include "InitCondUtils.hpp"
#include "wipemalloc.h"
#include "Algorithms.hpp"
using namespace Algorithms;
CustomShape::CustomShape() : Shape()
@ -233,11 +231,11 @@ CustomShape::CustomShape ( int id ) : Shape()
CustomShape::~CustomShape()
{
traverseVector<TraverseFunctors::DeleteFunctor<PerFrameEqn> > ( per_frame_eqn_tree );
traverse<TraverseFunctors::DeleteFunctor<InitCond> > ( init_cond_tree );
traverse<TraverseFunctors::DeleteFunctor<Param> > ( param_tree );
traverse<TraverseFunctors::DeleteFunctor<InitCond> > ( per_frame_init_eqn_tree );
traverse<TraverseFunctors::DeleteFunctor<Param> > ( text_properties_tree );
traverseVector<TraverseFunctors::Delete<PerFrameEqn> > ( per_frame_eqn_tree );
traverse<TraverseFunctors::Delete<InitCond> > ( init_cond_tree );
traverse<TraverseFunctors::Delete<Param> > ( param_tree );
traverse<TraverseFunctors::Delete<InitCond> > ( per_frame_init_eqn_tree );
traverse<TraverseFunctors::Delete<Param> > ( text_properties_tree );
}

View File

@ -534,6 +534,6 @@ void CustomWave::loadUnspecInitConds()
{
InitCondUtils::LoadUnspecInitCond fun(this->init_cond_tree, this->per_frame_init_eqn_tree);
Algorithms::traverse(param_tree, fun);
traverse(param_tree, fun);
}

View File

@ -71,15 +71,15 @@ MilkdropPreset::MilkdropPreset(const std::string & absoluteFilePath, const std::
MilkdropPreset::~MilkdropPreset()
{
Algorithms::traverse<Algorithms::TraverseFunctors::DeleteFunctor<InitCond> >(init_cond_tree);
traverse<TraverseFunctors::Delete<InitCond> >(init_cond_tree);
Algorithms::traverse<Algorithms::TraverseFunctors::DeleteFunctor<InitCond> >(per_frame_init_eqn_tree);
traverse<TraverseFunctors::Delete<InitCond> >(per_frame_init_eqn_tree);
Algorithms::traverse<Algorithms::TraverseFunctors::DeleteFunctor<PerPixelEqn> >(per_pixel_eqn_tree);
traverse<TraverseFunctors::Delete<PerPixelEqn> >(per_pixel_eqn_tree);
Algorithms::traverseVector<Algorithms::TraverseFunctors::DeleteFunctor<PerFrameEqn> >(per_frame_eqn_tree);
traverseVector<TraverseFunctors::Delete<PerFrameEqn> >(per_frame_eqn_tree);
Algorithms::traverse<Algorithms::TraverseFunctors::DeleteFunctor<Param> >(user_param_tree);
traverse<TraverseFunctors::Delete<Param> >(user_param_tree);
for (PresetOutputs::cwave_container::iterator pos = customWaves.begin(); pos != customWaves.end(); ++pos)
{
@ -324,8 +324,8 @@ void MilkdropPreset::loadBuiltinParamsUnspecInitConds() {
InitCondUtils::LoadUnspecInitCond loadUnspecInitCond(this->init_cond_tree, this->per_frame_init_eqn_tree);
this->builtinParams.traverse(loadUnspecInitCond);
Algorithms::traverse(user_param_tree, loadUnspecInitCond);
this->builtinParams.apply(loadUnspecInitCond);
traverse(user_param_tree, loadUnspecInitCond);
}