blob: 18a011ea28a8f0d4a6916a8b4f6b67ee92fbd4d5 [file] [log] [blame]
Davide Pesavento409cc202015-09-19 14:13:16 +02001/* -*- Mode:C++; c-file-style:"gnu"; indent-tabs-mode:nil; -*- */
Davide Pesavento1c597a12017-10-06 15:34:24 -04002/*
Junxiao Shib849f612018-04-01 23:52:54 +00003 * Copyright (c) 2013-2018 Regents of the University of California.
Davide Pesavento409cc202015-09-19 14:13:16 +02004 *
5 * This file is part of ndn-cxx library (NDN C++ library with eXperimental eXtensions).
6 *
7 * ndn-cxx library is free software: you can redistribute it and/or modify it under the
8 * terms of the GNU Lesser General Public License as published by the Free Software
9 * Foundation, either version 3 of the License, or (at your option) any later version.
10 *
11 * ndn-cxx library is distributed in the hope that it will be useful, but WITHOUT ANY
12 * WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
13 * PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
14 *
15 * You should have received copies of the GNU General Public License and GNU Lesser
16 * General Public License along with ndn-cxx, e.g., in COPYING.md file. If not, see
17 * <http://www.gnu.org/licenses/>.
18 *
19 * See AUTHORS.md for complete list of ndn-cxx authors and contributors.
20 */
21
22#ifndef NDN_UTIL_BACKPORTS_HPP
23#define NDN_UTIL_BACKPORTS_HPP
24
25#include "../common.hpp"
26
Davide Pesavento96b96af2015-09-19 23:00:40 +020027#ifndef NDN_CXX_HAVE_STD_TO_STRING
28#include <boost/lexical_cast.hpp>
29#endif
30
Davide Pesavento1c597a12017-10-06 15:34:24 -040031#ifdef __has_cpp_attribute
32# define NDN_CXX_HAS_CPP_ATTRIBUTE(x) __has_cpp_attribute(x)
33#else
34# define NDN_CXX_HAS_CPP_ATTRIBUTE(x) 0
35#endif
36
37#ifdef __has_include
38# define NDN_CXX_HAS_INCLUDE(x) __has_include(x)
39#else
40# define NDN_CXX_HAS_INCLUDE(x) 0
41#endif
42
Davide Pesaventoa52eb1f2017-10-06 20:37:43 -040043#if (__cplusplus >= 201402L) && NDN_CXX_HAS_CPP_ATTRIBUTE(deprecated)
44# define NDN_CXX_DEPRECATED_MSG(msg) [[deprecated(msg)]]
45#elif NDN_CXX_HAS_CPP_ATTRIBUTE(gnu::deprecated)
46# define NDN_CXX_DEPRECATED_MSG(msg) [[gnu::deprecated(msg)]]
47#elif defined(__GNUC__)
48# define NDN_CXX_DEPRECATED_MSG(msg) __attribute__((deprecated(msg)))
49#else
50# define NDN_CXX_DEPRECATED_MSG(msg)
51#endif
Junxiao Shib849f612018-04-01 23:52:54 +000052
53/** \brief Mark a type, variable, or function as deprecated.
54 *
55 * To deprecate a type \c DeprecatedType:
56 * \code
57 * typedef ModernType DeprecatedType NDN_CXX_DEPRECATED;
58 * \endcode
59 * This macro can only be applied to a typedef, not directly on a class.
60 *
61 * To deprecate a variable or class member \c deprecatedVar:
62 * \code
63 * int deprecatedVar NDN_CXX_DEPRECATED;
64 * \endcode
65 *
66 * To deprecate a function \c deprecatedFunc:
67 * \code
68 * NDN_CXX_DEPRECATED
69 * void
70 * deprecatedFunc(int a, NamedEnum b)
71 * {
72 * }
73 * \endcode
74 */
Davide Pesaventoa52eb1f2017-10-06 20:37:43 -040075#define NDN_CXX_DEPRECATED NDN_CXX_DEPRECATED_MSG("")
76
77#if (__cplusplus > 201402L) && NDN_CXX_HAS_CPP_ATTRIBUTE(fallthrough)
Davide Pesavento1c597a12017-10-06 15:34:24 -040078# define NDN_CXX_FALLTHROUGH [[fallthrough]]
79#elif NDN_CXX_HAS_CPP_ATTRIBUTE(clang::fallthrough)
80# define NDN_CXX_FALLTHROUGH [[clang::fallthrough]]
81#elif NDN_CXX_HAS_CPP_ATTRIBUTE(gnu::fallthrough)
82# define NDN_CXX_FALLTHROUGH [[gnu::fallthrough]]
83#elif defined(__GNUC__) && (__GNUC__ >= 7)
84# define NDN_CXX_FALLTHROUGH __attribute__((fallthrough))
85#else
86# define NDN_CXX_FALLTHROUGH ((void)0)
87#endif
88
Davide Pesavento409cc202015-09-19 14:13:16 +020089namespace ndn {
90
Davide Pesaventocf415762017-02-25 23:46:47 -050091#if __cpp_lib_make_unique >= 201304
Davide Pesavento409cc202015-09-19 14:13:16 +020092using std::make_unique;
93#else
Junxiao Shi1aecae22016-08-30 11:23:59 +000094template<typename T, typename ...Args>
Davide Pesavento409cc202015-09-19 14:13:16 +020095inline unique_ptr<T>
96make_unique(Args&&... args)
97{
98 return unique_ptr<T>(new T(std::forward<Args>(args)...));
99}
100#endif // __cpp_lib_make_unique
101
Davide Pesavento96b96af2015-09-19 23:00:40 +0200102#ifdef NDN_CXX_HAVE_STD_TO_STRING
103using std::to_string;
104#else
105template<typename V>
106inline std::string
107to_string(const V& v)
108{
109 return boost::lexical_cast<std::string>(v);
110}
111#endif // NDN_CXX_HAVE_STD_TO_STRING
112
Weiwei Liucfaa1ad2016-08-28 16:30:56 -0700113#if __cpp_lib_clamp >= 201603
114using std::clamp;
115#else
116template<typename T, typename Compare>
117constexpr const T&
118clamp(const T& v, const T& lo, const T& hi, Compare comp)
119{
120 return comp(v, lo) ? lo : comp(hi, v) ? hi : v;
121}
122
123template<typename T>
124constexpr const T&
125clamp(const T& v, const T& lo, const T& hi)
126{
127 return (v < lo) ? lo : (hi < v) ? hi : v;
128}
129#endif // __cpp_lib_clamp
130
Davide Pesavento409cc202015-09-19 14:13:16 +0200131} // namespace ndn
132
Junxiao Shi1aecae22016-08-30 11:23:59 +0000133#include "backports-optional.hpp"
Davide Pesaventocf415762017-02-25 23:46:47 -0500134#include "backports-ostream-joiner.hpp"
Junxiao Shi1aecae22016-08-30 11:23:59 +0000135
Davide Pesavento409cc202015-09-19 14:13:16 +0200136#endif // NDN_UTIL_BACKPORTS_HPP