| OpenMS 2.5.0

MacrosTest.h
Go to the documentation of this file.
1 // --------------------------------------------------------------------------
2 // OpenMS -- Open-Source Mass Spectrometry
3 // --------------------------------------------------------------------------
4 // Copyright The OpenMS Team -- Eberhard Karls University Tuebingen,
5 // ETH Zurich, and Freie Universitaet Berlin 2002-2020.
6 //
7 // This software is released under a three-clause BSD license:
8 // * Redistributions of source code must retain the above copyright
9 // notice, this list of conditions and the following disclaimer.
10 // * Redistributions in binary form must reproduce the above copyright
11 // notice, this list of conditions and the following disclaimer in the
12 // documentation and/or other materials provided with the distribution.
13 // * Neither the name of any author or any participating institution
14 // may be used to endorse or promote products derived from this software
15 // without specific prior written permission.
16 // For a full list of authors, refer to the file AUTHORS.
17 // --------------------------------------------------------------------------
18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
19 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
20 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
21 // ARE DISCLAIMED. IN NO EVENT SHALL ANY OF THE AUTHORS OR THE CONTRIBUTING
22 // INSTITUTIONS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
23 // EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
24 // PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS;
25 // OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
26 // WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
27 // OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
28 // ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 //
30 // --------------------------------------------------------------------------
31 // $Maintainer: Hannes Roest $
32 // $Authors: Philippe M. Groarke, Hannes Roest $
33 // --------------------------------------------------------------------------
34
35 // See https://philippegroarke.com/posts/2018/easy_defensive_programming/
36 // https://github.com/p-groarke/defensive_cpp
37
38 #pragma once
39 #include <type_traits>
40
41 namespace OpenMS
42 {
43 // no constexpr lamdas in C++11, therefore we have to use functions
44 namespace Test
45 {
46 #if __GNUC__ < 5
47 // older gcc, will not compile
48 bool fulfills_rule_of_5() {return true;}
49 bool fulfills_rule_of_6() {return true;}
50 bool fulfills_fast_vector() {return true;}
51 #else
52 template <class T>
53 constexpr bool fulfills_rule_of_5()
54 {
55 static_assert(std::is_destructible<T>::value, "T : must be destructible");
56 static_assert(std::is_copy_constructible<T>::value, "T : must be copy constructible");
57 static_assert(std::is_move_constructible<T>::value, "T : must be move constructible");
58 static_assert(std::is_copy_assignable<T>::value, "T : must be copy assignable");
59 static_assert(std::is_move_assignable<T>::value, "T : must be move assignable");
60
61 return std::is_destructible<T>::value &&
62 std::is_copy_constructible<T>::value &&
63 std::is_move_constructible<T>::value &&
64 std::is_copy_assignable<T>::value &&
65 std::is_move_assignable<T>::value;
66 }
67
68 template <class T>
69 constexpr bool fulfills_rule_of_6()
70 {
71 static_assert(fulfills_rule_of_5<T>(), "T : must fulfill rule of 5");
72 static_assert(std::is_default_constructible<T>::value, "T : must be default constructible");
73
74 return fulfills_rule_of_5<T>() &&
75 std::is_default_constructible<T>::value;
76 }
77
78 template <class T>
79 constexpr bool fulfills_fast_vector()
80 {
81 static_assert( (std::is_trivially_copy_constructible<T>::value && std::is_trivially_destructible<T>::value) ||
82 std::is_nothrow_move_constructible<T>::value,
83 "T : doesn't fulfill fast vector (trivially copy constructible " \
84 "and trivially destructible, or nothrow move constructible)");
85
86 return (std::is_trivially_copy_constructible<T>::value && std::is_trivially_destructible<T>::value) ||
87 std::is_nothrow_move_constructible<T>::value;
88 };
89 #endif // check for gcc < 5.0
90
91 }
92 }
93
OpenMS::Test::fulfills_fast_vector
bool fulfills_fast_vector()
Definition: MacrosTest.h:50
OpenMS::Test::fulfills_rule_of_6
bool fulfills_rule_of_6()
Definition: MacrosTest.h:49
OpenMS::Test::fulfills_rule_of_5
bool fulfills_rule_of_5()
Definition: MacrosTest.h:48
OpenMS
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:46