13
0
livetrax/libs/audiographer/audiographer/flag_debuggable.h
2010-03-15 19:11:48 +00:00

52 lines
1.3 KiB
C++

#ifndef AUDIOGRAPHER_FLAG_DEBUGGABLE_H
#define AUDIOGRAPHER_FLAG_DEBUGGABLE_H
#include "debuggable.h"
#include "debug_utils.h"
#include "process_context.h"
#include "types.h"
#include <boost/format.hpp>
namespace AudioGrapher
{
/// A debugging class for nodes that support a certain set of flags.
template<DebugLevel L = DEFAULT_DEBUG_LEVEL>
class FlagDebuggable : public Debuggable<L>
{
public:
typedef FlagField::Flag Flag;
protected:
/// Adds a flag to the set of flags supported
void add_supported_flag (Flag flag)
{
flags.set (flag);
}
/// Prints debug output if \a context contains flags that are not supported by this class
template<typename SelfType, typename ContextType>
void check_flags (SelfType & self, ProcessContext<ContextType> context)
{
if (!Debuggable<L>::debug_level (DebugFlags)) { return; }
FlagField unsupported = flags.unsupported_flags_of (context.flags());
for (FlagField::iterator it = unsupported.begin(); it != unsupported.end(); ++it) {
Debuggable<L>::debug_stream() << boost::str (boost::format
("%1% does not support flag %2%")
% DebugUtils::demangled_name (self) % DebugUtils::process_context_flag_name (*it)
) << std::endl;
}
}
private:
FlagField flags;
};
} // namespace
#endif // AUDIOGRAPHER_FLAG_DEBUGGABLE_H