• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *  Copyright (c) 2020, The OpenThread Authors.
3  *  All rights reserved.
4  *
5  *  Redistribution and use in source and binary forms, with or without
6  *  modification, are permitted provided that the following conditions are met:
7  *  1. Redistributions of source code must retain the above copyright
8  *     notice, this list of conditions and the following disclaimer.
9  *  2. Redistributions in binary form must reproduce the above copyright
10  *     notice, this list of conditions and the following disclaimer in the
11  *     documentation and/or other materials provided with the distribution.
12  *  3. Neither the name of the copyright holder nor the
13  *     names of its contributors may be used to endorse or promote products
14  *     derived from this software without specific prior written permission.
15  *
16  *  THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
17  *  AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
18  *  IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
19  *  ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE
20  *  LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
21  *  CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
22  *  SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
23  *  INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
24  *  CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
25  *  ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
26  *  POSSIBILITY OF SUCH DAMAGE.
27  */
28 
29 /**
30  * @file
31  *   This file includes definitions for Equatable class for OpenThread objects.
32  */
33 
34 #ifndef EQUATABLE_HPP_
35 #define EQUATABLE_HPP_
36 
37 #include "openthread-core-config.h"
38 
39 #include <string.h>
40 
41 namespace ot {
42 
43 /**
44  * Defines an overload of operator `!=`.
45  *
46  * The `!=` implementation uses an existing `==` overload provided by the `Type` class.
47  *
48  * Users of this class should follow CRTP-style inheritance, i.e., the `Type` class itself should publicly inherit
49  * from `Unequatable<Type>`.
50  */
51 template <typename Type> class Unequatable
52 {
53 public:
54     /**
55      * Overloads operator `!=` to evaluate whether or not two instances of `Type` are equal.
56      *
57      * This is implemented in terms of an existing `==` overload provided by `Type` class itself.
58      *
59      * @param[in]  aOther  The other `Type` instance to compare with.
60      *
61      * @retval TRUE   If the two `Type` instances are not equal.
62      * @retval FALSE  If the two `Type` instances are equal.
63      */
operator !=(const Type & aOther) const64     bool operator!=(const Type &aOther) const { return !(*static_cast<const Type *>(this) == aOther); }
65 };
66 
67 /**
68  * Defines overloads of operators `==` and `!=`.
69  *
70  * The `==` implementation simply compares all the bytes of two `Type` instances to be equal (using `memcmp()`).
71  *
72  * Users of this class should follow CRTP-style inheritance, i.e., the `Type` class itself should publicly inherit
73  * from `Equatable<Type>`.
74  */
75 template <typename Type> class Equatable : public Unequatable<Type>
76 {
77 public:
78     /**
79      * Overloads operator `==` to evaluate whether or not two instances of `Type` are equal.
80      *
81      * @param[in]  aOther  The other `Type` instance to compare with.
82      *
83      * @retval TRUE   If the two `Type` instances are equal.
84      * @retval FALSE  If the two `Type` instances are not equal.
85      */
operator ==(const Type & aOther) const86     bool operator==(const Type &aOther) const
87     {
88         return memcmp(static_cast<const Type *>(this), &aOther, sizeof(Type)) == 0;
89     }
90 };
91 
92 } // namespace ot
93 
94 #endif // EQUATABLE_HPP_
95