blob: 549b81df9f68ff1e2516a69aff21f3706ea25ce3 [file] [log] [blame]
/*
* Copyright Andrey Semashev 2007 - 2015.
* Distributed under the Boost Software License, Version 1.0.
* (See accompanying file LICENSE_1_0.txt or copy at
* http://www.boost.org/LICENSE_1_0.txt)
*/
/*!
* \file fallback_policy.hpp
* \author Andrey Semashev
* \date 18.08.2012
*
* The header contains definition of fallback policies when attribute value visitation or extraction fails.
*/
#ifndef BOOST_LOG_ATTRIBUTES_FALLBACK_POLICY_HPP_INCLUDED_
#define BOOST_LOG_ATTRIBUTES_FALLBACK_POLICY_HPP_INCLUDED_
#include <boost/type_traits/remove_cv.hpp>
#include <boost/type_traits/remove_reference.hpp>
#include <boost/log/detail/config.hpp>
#include <boost/log/exceptions.hpp>
#include <boost/log/utility/type_info_wrapper.hpp>
#include <boost/log/attributes/fallback_policy_fwd.hpp>
#include <boost/log/detail/header.hpp>
#ifdef BOOST_HAS_PRAGMA_ONCE
#pragma once
#endif
namespace boost {
BOOST_LOG_OPEN_NAMESPACE
/*!
* The \c fallback_to_none policy results in returning an empty value reference if the attribute value cannot be extracted.
*/
struct fallback_to_none
{
enum { guaranteed_result = false };
/*!
* The method is called in order to apply a function object to the default value.
*/
template< typename FunT >
static bool apply_default(FunT&)
{
return false;
}
/*!
* The method is called in order to apply a function object to the default value.
*/
template< typename FunT >
static bool apply_default(FunT const&)
{
return false;
}
/*!
* The method is called when value extraction failed because the attribute value has different type than requested.
*/
static void on_invalid_type(type_info_wrapper const&)
{
}
/*!
* The method is called when value extraction failed because the attribute value was not found.
*/
static void on_missing_value()
{
}
};
/*!
* The \c fallback_to_throw policy results in throwing an exception if the attribute value cannot be extracted.
*/
struct fallback_to_throw
{
enum { guaranteed_result = true };
/*!
* The method is called in order to apply a function object to the default value.
*/
template< typename FunT >
static bool apply_default(FunT&)
{
return false;
}
/*!
* The method is called in order to apply a function object to the default value.
*/
template< typename FunT >
static bool apply_default(FunT const&)
{
return false;
}
/*!
* The method is called when value extraction failed because the attribute value has different type than requested.
*/
static void on_invalid_type(type_info_wrapper const& t)
{
BOOST_LOG_THROW_DESCR_PARAMS(invalid_type, "Attribute value has incompatible type", (t));
}
/*!
* The method is called when value extraction failed because the attribute value was not found.
*/
static void on_missing_value()
{
BOOST_LOG_THROW_DESCR(missing_value, "Attribute value not found");
}
};
/*!
* The \c fallback_to_default policy results in a default value if the attribute value cannot be extracted.
*/
template< typename DefaultT >
struct fallback_to_default
{
enum { guaranteed_result = true };
//! Default value type
typedef typename remove_cv< typename remove_reference< DefaultT >::type >::type default_type;
/*!
* Default constructor.
*/
fallback_to_default() : m_default()
{
}
/*!
* Initializing constructor.
*/
explicit fallback_to_default(default_type const& def_val) : m_default(def_val)
{
}
/*!
* The method is called in order to apply a function object to the default value.
*/
template< typename FunT >
bool apply_default(FunT& fun) const
{
fun(m_default);
return true;
}
/*!
* The method is called in order to apply a function object to the default value.
*/
template< typename FunT >
bool apply_default(FunT const& fun) const
{
fun(m_default);
return true;
}
/*!
* The method is called when value extraction failed because the attribute value has different type than requested.
*/
static void on_invalid_type(type_info_wrapper const&)
{
}
/*!
* The method is called when value extraction failed because the attribute value was not found.
*/
static void on_missing_value()
{
}
private:
//! Default value
DefaultT m_default;
};
BOOST_LOG_CLOSE_NAMESPACE // namespace log
} // namespace boost
#include <boost/log/detail/footer.hpp>
#endif // BOOST_LOG_ATTRIBUTES_FALLBACK_POLICY_HPP_INCLUDED_