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
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:46
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