genode/repos/os/src/server/input_filter/include_accessor.h

68 lines
1.4 KiB
C++

/*
* \brief Interface for accessing a configuration snippets
* \author Norman Feske
* \date 2017-02-10
*/
/*
* Copyright (C) 2017 Genode Labs GmbH
*
* This file is part of the Genode OS framework, which is distributed
* under the terms of the GNU General Public License version 2.
*/
#ifndef _INPUT_FILTER__INCLUDE_ACCESSOR_H_
#define _INPUT_FILTER__INCLUDE_ACCESSOR_H_
/* Genode includes */
#include <util/xml_node.h>
/* local includes */
#include <types.h>
namespace Input_filter { struct Include_accessor; }
class Input_filter::Include_accessor
{
public:
typedef String<64> Name;
typedef String<32> Type;
struct Include_unavailable : Exception { };
protected:
struct Functor { virtual void apply(Xml_node node) const = 0; };
/*
* \throw Include_unavailable
*/
virtual void _apply_include(Name const &name, Type const &type, Functor const &) = 0;
public:
/**
* Call functor 'fn' with the 'Xml_node' of the named include
*
* \throw Include_unavailable
*/
template <typename FN>
void apply_include(Name const &name, Type const &type, FN const &fn)
{
struct Functor : Include_accessor::Functor
{
FN const &fn;
Functor(FN const &fn) : fn(fn) { }
void apply(Xml_node node) const override { fn(node); }
} _functor(fn);
_apply_include(name, type, _functor);
}
};
#endif /* _INPUT_FILTER__INCLUDE_ACCESSOR_H_ */