OpenMS  3.0.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-2022.
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 lambdas in C++11, therefore we have to use functions
44  namespace Test
45  {
46  template <class T>
47  constexpr bool fulfills_rule_of_5()
48  {
49  static_assert(std::is_destructible<T>::value, "T : must be destructible");
50  static_assert(std::is_copy_constructible<T>::value, "T : must be copy constructible");
51  static_assert(std::is_move_constructible<T>::value, "T : must be move constructible");
52  static_assert(std::is_copy_assignable<T>::value, "T : must be copy assignable");
53  static_assert(std::is_move_assignable<T>::value, "T : must be move assignable");
54 
55  return std::is_destructible<T>::value &&
56  std::is_copy_constructible<T>::value &&
57  std::is_move_constructible<T>::value &&
58  std::is_copy_assignable<T>::value &&
59  std::is_move_assignable<T>::value;
60  }
61 
62  template <class T>
63  constexpr bool fulfills_rule_of_6()
64  {
65  static_assert(fulfills_rule_of_5<T>(), "T : must fulfill rule of 5");
66  static_assert(std::is_default_constructible<T>::value, "T : must be default constructible");
67 
68  return fulfills_rule_of_5<T>() &&
69  std::is_default_constructible<T>::value;
70  }
71 
72  template <class T>
73  constexpr bool fulfills_fast_vector()
74  {
75  static_assert( (std::is_trivially_copy_constructible<T>::value && std::is_trivially_destructible<T>::value) ||
76  std::is_nothrow_move_constructible<T>::value,
77  "T : doesn't fulfill fast vector (trivially copy constructible " \
78  "and trivially destructible, or nothrow move constructible)");
79 
80  return (std::is_trivially_copy_constructible<T>::value && std::is_trivially_destructible<T>::value) ||
81  std::is_nothrow_move_constructible<T>::value;
82  };
83  }
84 }
85 
OpenMS::Test::fulfills_rule_of_5
constexpr bool fulfills_rule_of_5()
Definition: MacrosTest.h:47
OpenMS
Main OpenMS namespace.
Definition: FeatureDeconvolution.h:47
OpenMS::Test::fulfills_fast_vector
constexpr bool fulfills_fast_vector()
Definition: MacrosTest.h:73
OpenMS::Test::fulfills_rule_of_6
constexpr bool fulfills_rule_of_6()
Definition: MacrosTest.h:63