/*  This file is part of the Vc library.

    Copyright (C) 2009 Matthias Kretz <kretz@kde.org>

    Vc 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 3 of
    the License, or (at your option) any later version.

    Vc 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 Vc.  If not, see <http://www.gnu.org/licenses/>.

*/

#ifndef INCLUDE_VC_LIMITS
#define INCLUDE_VC_LIMITS

#include "vector.h"
#include "common/macros.h"
#include <limits>

namespace std
{
template<typename T> struct numeric_limits<Vc::Vector<T> > : public numeric_limits<typename Vc::Vector<T>::EntryType>
{
private:
    typedef numeric_limits<typename Vc::Vector<T>::EntryType> _Base;
public:
    static Vc_INTRINSIC Vc_CONST Vc::Vector<T> max()           { return Vc::Vector<T>(_Base::max()); }
    static Vc_INTRINSIC Vc_CONST Vc::Vector<T> min()           { return Vc::Vector<T>(_Base::min()); }
    static Vc_INTRINSIC Vc_CONST Vc::Vector<T> lowest()        { return Vc::Vector<T>(_Base::lowest()); }
    static Vc_INTRINSIC Vc_CONST Vc::Vector<T> epsilon()       { return Vc::Vector<T>(_Base::epsilon()); }
    static Vc_INTRINSIC Vc_CONST Vc::Vector<T> round_error()   { return Vc::Vector<T>(_Base::round_error()); }
    static Vc_INTRINSIC Vc_CONST Vc::Vector<T> infinity()      { return Vc::Vector<T>(_Base::infinity()); }
    static Vc_INTRINSIC Vc_CONST Vc::Vector<T> quiet_NaN()     { return Vc::Vector<T>(_Base::quiet_NaN()); }
    static Vc_INTRINSIC Vc_CONST Vc::Vector<T> signaling_NaN() { return Vc::Vector<T>(_Base::signaling_NaN()); }
    static Vc_INTRINSIC Vc_CONST Vc::Vector<T> denorm_min()    { return Vc::Vector<T>(_Base::denorm_min()); }
};
} // namespace std

#include "common/undomacros.h"
#ifdef VC_IMPL_Scalar
# include "scalar/limits.h"
#elif defined(VC_IMPL_AVX)
# include "avx/limits.h"
#elif defined(VC_IMPL_SSE)
# include "sse/limits.h"
#endif

#endif // INCLUDE_VC_LIMITS

// vim: ft=cpp
