// Description: An extended view using a constant border
// Documentation: extendedconstviews.txt
#ifndef PASTELSYS_BORDEREDCONSTVIEW_H
#define PASTELSYS_BORDEREDCONSTVIEW_H
#include "pastel/sys/view/extendedconstview.h"
#include "pastel/sys/view/view.h"
namespace Pastel
{
template <integer N, typename Contained_ConstView>
class BorderedConstView
{
public:
static constexpr int Dimension = N;
using Element = typename Contained_ConstView::Element;
BorderedConstView()
: view_()
, border_()
{
}
explicit BorderedConstView(
const Contained_ConstView& view,
const Element& border)
: view_(view)
, border_(border)
{
}
const Vector<integer, N>& extent() const
{
return view_.extent();
}
const Element& operator()(
const Vector<integer, N>& position) const
{
if (anyLess(position, 0) ||
anyGreaterEqual(position, view_.extent()))
{
return border_;
}
return view_(position);
}
private:
Contained_ConstView view_;
Element border_;
};
template <integer N, typename Input_Element, typename Input_ConstView>
ExtendedConstView<N, Input_Element,
BorderedConstView<N, ConstView<N, Input_Element, Input_ConstView> > >
borderedConstView(
const ConstView<N, Input_Element, Input_ConstView>& view,
const NoDeduction<Input_Element>& border)
{
return extendedConstView<N>(BorderedConstView<
N, ConstView<N, Input_Element, Input_ConstView> >(view, border));
}
}
#endif