/**
 * projectM -- Milkdrop-esque visualisation SDK
 * Copyright (C)2003-2007 projectM Team
 *
 * This library is free software; you can redistribute it and/or
 * modify it under the terms of the GNU Lesser General Public
 * License as published by the Free Software Foundation; either
 * version 2.1 of the License, or (at your option) any later version.
 *
 * This library is distributed in the hope that it will be useful,
 * but WITHOUT ANY WARRANTY; without even the implied warranty of
 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
 * Lesser General Public License for more details.
 *
 * You should have received a copy of the GNU Lesser General Public
 * License along with this library; if not, write to the Free Software
 * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
 * See 'LICENSE.txt' included within this release
 *
 */


/**  BuiltinParams.hpp :: a class to encapsulate and centralize
  *   all projectm builtin parameter methods and state. Used primarily
  *   by preset class
**/
#ifndef _BUILTIN_PARAMS_HPP
#define _BUILTIN_PARAMS_HPP

#include <string>
#include "PresetFrameIO.hpp"
#include "Param.hpp"
#include <map>
#include <cstdio>

class BuiltinParams {

public:
   typedef std::map<std::string, std::string> AliasMap;

    /** Default constructor leaves database in an uninitialized state.  */
    BuiltinParams();

    /** Construct a new builtin parameter database with variables references given by
     * the preset input and output structures */
     BuiltinParams(PresetInputs &  presetInputs, PresetOutputs & presetOutputs);

    ~BuiltinParams();

    /** Param database initalizer / destructor functions */
    int init_builtin_param_db(const PresetInputs & presetInputs, PresetOutputs & presetOutputs);
    int load_all_builtin_param(const PresetInputs & presetInputs, PresetOutputs & presetOutputs);
    int destroy_builtin_param_db();

    int insert_param_alt_name( Param *param, const std::string& salt_name );
    Param *find_builtin_param( const std::string & name );
    int load_builtin_param_float( const std::string & name, void *engine_val, void *matrix,
                                  short int flags,
                                  float init_val, float upper_bound,
                                  float lower_bound, const std::string & alt_name );
    int load_builtin_param_int( const std::string & name, void *engine_val, short int flags,
                                int init_val, int upper_bound,
                                int lower_bound, const std::string & alt_name );
    int load_builtin_param_bool( const std::string & name, void *engine_val, short int flags,
                                int init_val, const std::string & alt_name );

    int load_builtin_param_string( const std::string & name, std::string * engine_val, short int flags);

    int insert_builtin_param( Param *param );

    template <class Fun>
    void apply(Fun & fun) {
	traverse(builtin_param_tree, fun);
    }


private:
    static const bool BUILTIN_PARAMS_DEBUG = false;

    // Used to associate multiple string names to one parameter
    AliasMap aliasMap;

    // Internal datastructure to store the parameters
    std::map<std::string,Param*> builtin_param_tree;
};
#endif
