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  * This template class 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  */
52 template <typename Type> class Unequatable
53 {
54 public:
55     /**
56      * This method overloads operator `!=` to evaluate whether or not two instances of `Type` are equal.
57      *
58      * This is implemented in terms of an existing `==` overload provided by `Type` class itself.
59      *
60      * @param[in]  aOther  The other `Type` instance to compare with.
61      *
62      * @retval TRUE   If the two `Type` instances are not equal.
63      * @retval FALSE  If the two `Type` instances are equal.
64      *
65      */
operator !=(const Type & aOther) const66     bool operator!=(const Type &aOther) const { return !(*static_cast<const Type *>(this) == aOther); }
67 };
68 
69 /**
70  * This template class defines overloads of operators `==` and `!=`.
71  *
72  * The `==` implementation simply compares all the bytes of two `Type` instances to be equal (using `memcmp()`).
73  *
74  * Users of this class should follow CRTP-style inheritance, i.e., the `Type` class itself should publicly inherit
75  * from `Equatable<Type>`.
76  *
77  */
78 template <typename Type> class Equatable : public Unequatable<Type>
79 {
80 public:
81     /**
82      * This method overloads operator `==` to evaluate whether or not two instances of `Type` are equal.
83      *
84      * @param[in]  aOther  The other `Type` instance to compare with.
85      *
86      * @retval TRUE   If the two `Type` instances are equal.
87      * @retval FALSE  If the two `Type` instances are not equal.
88      *
89      */
operator ==(const Type & aOther) const90     bool operator==(const Type &aOther) const
91     {
92         return memcmp(static_cast<const Type *>(this), &aOther, sizeof(Type)) == 0;
93     }
94 };
95 
96 } // namespace ot
97 
98 #endif // EQUATABLE_HPP_
99