游戏王对战板,目前code还是空的

Committer:
WFKnight
Date:
Thu Jun 21 13:51:43 2018 +0000
Revision:
0:9b3d4731edbb
UART, RTOS, LED

Who changed what in which revision?

UserRevisionLine numberNew contents of line
WFKnight 0:9b3d4731edbb 1 /* Copyright (c) 2017 ARM Limited
WFKnight 0:9b3d4731edbb 2 *
WFKnight 0:9b3d4731edbb 3 * Licensed under the Apache License, Version 2.0 (the "License");
WFKnight 0:9b3d4731edbb 4 * you may not use this file except in compliance with the License.
WFKnight 0:9b3d4731edbb 5 * You may obtain a copy of the License at
WFKnight 0:9b3d4731edbb 6 *
WFKnight 0:9b3d4731edbb 7 * http://www.apache.org/licenses/LICENSE-2.0
WFKnight 0:9b3d4731edbb 8 *
WFKnight 0:9b3d4731edbb 9 * Unless required by applicable law or agreed to in writing, software
WFKnight 0:9b3d4731edbb 10 * distributed under the License is distributed on an "AS IS" BASIS,
WFKnight 0:9b3d4731edbb 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
WFKnight 0:9b3d4731edbb 12 * See the License for the specific language governing permissions and
WFKnight 0:9b3d4731edbb 13 * limitations under the License.
WFKnight 0:9b3d4731edbb 14 */
WFKnight 0:9b3d4731edbb 15
WFKnight 0:9b3d4731edbb 16 #ifndef MBED_NONCOPYABLE_H_
WFKnight 0:9b3d4731edbb 17 #define MBED_NONCOPYABLE_H_
WFKnight 0:9b3d4731edbb 18
WFKnight 0:9b3d4731edbb 19 #if (!defined(MBED_DEBUG) && (MBED_CONF_PLATFORM_FORCE_NON_COPYABLE_ERROR == 0))
WFKnight 0:9b3d4731edbb 20 #include "mbed_toolchain.h"
WFKnight 0:9b3d4731edbb 21 #include "mbed_debug.h"
WFKnight 0:9b3d4731edbb 22 #endif
WFKnight 0:9b3d4731edbb 23
WFKnight 0:9b3d4731edbb 24 namespace mbed {
WFKnight 0:9b3d4731edbb 25
WFKnight 0:9b3d4731edbb 26 /**
WFKnight 0:9b3d4731edbb 27 * Inheriting from this class autogeneration of copy construction and copy
WFKnight 0:9b3d4731edbb 28 * assignment operations.
WFKnight 0:9b3d4731edbb 29 *
WFKnight 0:9b3d4731edbb 30 * Classes which are not value type should inherit privately from this class
WFKnight 0:9b3d4731edbb 31 * to avoid generation of invalid copy constructor or copy assignment operator
WFKnight 0:9b3d4731edbb 32 * which can lead to unnoticeable programming errors.
WFKnight 0:9b3d4731edbb 33 *
WFKnight 0:9b3d4731edbb 34 * As an example consider the following signature:
WFKnight 0:9b3d4731edbb 35 *
WFKnight 0:9b3d4731edbb 36 * @code
WFKnight 0:9b3d4731edbb 37 * class Resource;
WFKnight 0:9b3d4731edbb 38 *
WFKnight 0:9b3d4731edbb 39 * class Foo {
WFKnight 0:9b3d4731edbb 40 * public:
WFKnight 0:9b3d4731edbb 41 * Foo() : _resource(new Resource()) { }
WFKnight 0:9b3d4731edbb 42 * ~Foo() { delete _resource; }
WFKnight 0:9b3d4731edbb 43 * private:
WFKnight 0:9b3d4731edbb 44 * Resource* _resource;
WFKnight 0:9b3d4731edbb 45 * }
WFKnight 0:9b3d4731edbb 46 *
WFKnight 0:9b3d4731edbb 47 * Foo get_foo();
WFKnight 0:9b3d4731edbb 48 *
WFKnight 0:9b3d4731edbb 49 * Foo foo = get_foo();
WFKnight 0:9b3d4731edbb 50 * @endcode
WFKnight 0:9b3d4731edbb 51 *
WFKnight 0:9b3d4731edbb 52 * There is a bug in this function, it returns a temporary value which will be
WFKnight 0:9b3d4731edbb 53 * byte copied into foo then destroyed. Unfortunately, internally the Foo class
WFKnight 0:9b3d4731edbb 54 * manage a pointer to a Resource object. This pointer will be released when the
WFKnight 0:9b3d4731edbb 55 * temporary is destroyed and foo will manage a pointer to an already released
WFKnight 0:9b3d4731edbb 56 * Resource.
WFKnight 0:9b3d4731edbb 57 *
WFKnight 0:9b3d4731edbb 58 * Two issues has to be fixed in the example above:
WFKnight 0:9b3d4731edbb 59 * - Function signature has to be changed to reflect the fact that Foo
WFKnight 0:9b3d4731edbb 60 * instances cannot be copied. In that case accessor should return a
WFKnight 0:9b3d4731edbb 61 * reference to give access to objects already existing and managed.
WFKnight 0:9b3d4731edbb 62 * Generator on the other hand should return a pointer to the created object.
WFKnight 0:9b3d4731edbb 63 *
WFKnight 0:9b3d4731edbb 64 * @code
WFKnight 0:9b3d4731edbb 65 * // return a reference to an already managed Foo instance
WFKnight 0:9b3d4731edbb 66 * Foo& get_foo();
WFKnight 0:9b3d4731edbb 67 * Foo& foo = get_foo();
WFKnight 0:9b3d4731edbb 68 *
WFKnight 0:9b3d4731edbb 69 * // create a new Foo instance
WFKnight 0:9b3d4731edbb 70 * Foo* make_foo();
WFKnight 0:9b3d4731edbb 71 * Foo* m = make_foo();
WFKnight 0:9b3d4731edbb 72 * @endcode
WFKnight 0:9b3d4731edbb 73 *
WFKnight 0:9b3d4731edbb 74 * - Copy constructor and copy assignment operator has to be made private
WFKnight 0:9b3d4731edbb 75 * in the Foo class. It prevents unwanted copy of Foo objects. This can be
WFKnight 0:9b3d4731edbb 76 * done by declaring copy constructor and copy assignment in the private
WFKnight 0:9b3d4731edbb 77 * section of the Foo class.
WFKnight 0:9b3d4731edbb 78 *
WFKnight 0:9b3d4731edbb 79 * @code
WFKnight 0:9b3d4731edbb 80 * class Foo {
WFKnight 0:9b3d4731edbb 81 * public:
WFKnight 0:9b3d4731edbb 82 * Foo() : _resource(new Resource()) { }
WFKnight 0:9b3d4731edbb 83 * ~Foo() { delete _resource; }
WFKnight 0:9b3d4731edbb 84 * private:
WFKnight 0:9b3d4731edbb 85 * // disallow copy operations
WFKnight 0:9b3d4731edbb 86 * Foo(const Foo&);
WFKnight 0:9b3d4731edbb 87 * Foo& operator=(const Foo&);
WFKnight 0:9b3d4731edbb 88 * // data members
WFKnight 0:9b3d4731edbb 89 * Resource* _resource;
WFKnight 0:9b3d4731edbb 90 * }
WFKnight 0:9b3d4731edbb 91 * @endcode
WFKnight 0:9b3d4731edbb 92 *
WFKnight 0:9b3d4731edbb 93 * Another solution is to inherit privately from the NonCopyable class.
WFKnight 0:9b3d4731edbb 94 * It reduces the boiler plate needed to avoid copy operations but more
WFKnight 0:9b3d4731edbb 95 * importantly it clarifies the programmer intent and the object semantic.
WFKnight 0:9b3d4731edbb 96 *
WFKnight 0:9b3d4731edbb 97 * class Foo : private NonCopyable<Foo> {
WFKnight 0:9b3d4731edbb 98 * public:
WFKnight 0:9b3d4731edbb 99 * Foo() : _resource(new Resource()) { }
WFKnight 0:9b3d4731edbb 100 * ~Foo() { delete _resource; }
WFKnight 0:9b3d4731edbb 101 * private:
WFKnight 0:9b3d4731edbb 102 * Resource* _resource;
WFKnight 0:9b3d4731edbb 103 * }
WFKnight 0:9b3d4731edbb 104 *
WFKnight 0:9b3d4731edbb 105 * @tparam T The type that should be made non copyable. It prevent cases where
WFKnight 0:9b3d4731edbb 106 * the empty base optimization cannot be applied and therefore ensure that the
WFKnight 0:9b3d4731edbb 107 * cost of this semantic sugar is null.
WFKnight 0:9b3d4731edbb 108 *
WFKnight 0:9b3d4731edbb 109 * As an example, the empty base optimization is prohibited if one of the empty
WFKnight 0:9b3d4731edbb 110 * base class is also a base type of the first non static data member:
WFKnight 0:9b3d4731edbb 111 *
WFKnight 0:9b3d4731edbb 112 * @code
WFKnight 0:9b3d4731edbb 113 * struct A { };
WFKnight 0:9b3d4731edbb 114 * struct B : A {
WFKnight 0:9b3d4731edbb 115 * int foo;
WFKnight 0:9b3d4731edbb 116 * };
WFKnight 0:9b3d4731edbb 117 * // thanks to empty base optimization, sizeof(B) == sizeof(int)
WFKnight 0:9b3d4731edbb 118 *
WFKnight 0:9b3d4731edbb 119 * struct C : A {
WFKnight 0:9b3d4731edbb 120 * B b;
WFKnight 0:9b3d4731edbb 121 * };
WFKnight 0:9b3d4731edbb 122 *
WFKnight 0:9b3d4731edbb 123 * // empty base optimization cannot be applied here because A from C and A from
WFKnight 0:9b3d4731edbb 124 * // B shall have a different address. In that case, with the alignment
WFKnight 0:9b3d4731edbb 125 * // sizeof(C) == 2* sizeof(int)
WFKnight 0:9b3d4731edbb 126 * @endcode
WFKnight 0:9b3d4731edbb 127 *
WFKnight 0:9b3d4731edbb 128 * The solution to that problem is to templatize the empty class to makes it
WFKnight 0:9b3d4731edbb 129 * unique to the type it is applied to:
WFKnight 0:9b3d4731edbb 130 *
WFKnight 0:9b3d4731edbb 131 * @code
WFKnight 0:9b3d4731edbb 132 * template<typename T>
WFKnight 0:9b3d4731edbb 133 * struct A<T> { };
WFKnight 0:9b3d4731edbb 134 * struct B : A<B> {
WFKnight 0:9b3d4731edbb 135 * int foo;
WFKnight 0:9b3d4731edbb 136 * };
WFKnight 0:9b3d4731edbb 137 * struct C : A<C> {
WFKnight 0:9b3d4731edbb 138 * B b;
WFKnight 0:9b3d4731edbb 139 * };
WFKnight 0:9b3d4731edbb 140 *
WFKnight 0:9b3d4731edbb 141 * // empty base optimization can be applied B and C does not refer to the same
WFKnight 0:9b3d4731edbb 142 * // kind of A. sizeof(C) == sizeof(B) == sizeof(int).
WFKnight 0:9b3d4731edbb 143 * @endcode
WFKnight 0:9b3d4731edbb 144 *
WFKnight 0:9b3d4731edbb 145 * @note Compile time errors are disabled if the develop or the release profile
WFKnight 0:9b3d4731edbb 146 * is used. To override this behavior and force compile time errors in all profile
WFKnight 0:9b3d4731edbb 147 * set the configuration parameter "platform.force-non-copyable-error" to true.
WFKnight 0:9b3d4731edbb 148 */
WFKnight 0:9b3d4731edbb 149 template<typename T>
WFKnight 0:9b3d4731edbb 150 class NonCopyable {
WFKnight 0:9b3d4731edbb 151 protected:
WFKnight 0:9b3d4731edbb 152 /**
WFKnight 0:9b3d4731edbb 153 * Disallow construction of NonCopyable objects from outside of its hierarchy.
WFKnight 0:9b3d4731edbb 154 */
WFKnight 0:9b3d4731edbb 155 NonCopyable() { }
WFKnight 0:9b3d4731edbb 156 /**
WFKnight 0:9b3d4731edbb 157 * Disallow destruction of NonCopyable objects from outside of its hierarchy.
WFKnight 0:9b3d4731edbb 158 */
WFKnight 0:9b3d4731edbb 159 ~NonCopyable() { }
WFKnight 0:9b3d4731edbb 160
WFKnight 0:9b3d4731edbb 161 #if (!defined(MBED_DEBUG) && (MBED_CONF_PLATFORM_FORCE_NON_COPYABLE_ERROR == 0))
WFKnight 0:9b3d4731edbb 162 /**
WFKnight 0:9b3d4731edbb 163 * NonCopyable copy constructor.
WFKnight 0:9b3d4731edbb 164 *
WFKnight 0:9b3d4731edbb 165 * A compile time warning is issued when this function is used and a runtime
WFKnight 0:9b3d4731edbb 166 * warning is printed when the copy construction of the non copyable happens.
WFKnight 0:9b3d4731edbb 167 *
WFKnight 0:9b3d4731edbb 168 * If you see this warning, your code is probably doing something unspecified.
WFKnight 0:9b3d4731edbb 169 * Copy of non copyable resources can lead to resource leak and random error.
WFKnight 0:9b3d4731edbb 170 */
WFKnight 0:9b3d4731edbb 171 MBED_DEPRECATED("Invalid copy construction of a NonCopyable resource.")
WFKnight 0:9b3d4731edbb 172 NonCopyable(const NonCopyable&)
WFKnight 0:9b3d4731edbb 173 {
WFKnight 0:9b3d4731edbb 174 debug("Invalid copy construction of a NonCopyable resource: %s\r\n", MBED_PRETTY_FUNCTION);
WFKnight 0:9b3d4731edbb 175 }
WFKnight 0:9b3d4731edbb 176
WFKnight 0:9b3d4731edbb 177 /**
WFKnight 0:9b3d4731edbb 178 * NonCopyable copy assignment operator.
WFKnight 0:9b3d4731edbb 179 *
WFKnight 0:9b3d4731edbb 180 * A compile time warning is issued when this function is used and a runtime
WFKnight 0:9b3d4731edbb 181 * warning is printed when the copy construction of the non copyable happens.
WFKnight 0:9b3d4731edbb 182 *
WFKnight 0:9b3d4731edbb 183 * If you see this warning, your code is probably doing something unspecified.
WFKnight 0:9b3d4731edbb 184 * Copy of non copyable resources can lead to resource leak and random error.
WFKnight 0:9b3d4731edbb 185 */
WFKnight 0:9b3d4731edbb 186 MBED_DEPRECATED("Invalid copy assignment of a NonCopyable resource.")
WFKnight 0:9b3d4731edbb 187 NonCopyable& operator=(const NonCopyable&)
WFKnight 0:9b3d4731edbb 188 {
WFKnight 0:9b3d4731edbb 189 debug("Invalid copy assignment of a NonCopyable resource: %s\r\n", MBED_PRETTY_FUNCTION);
WFKnight 0:9b3d4731edbb 190 return *this;
WFKnight 0:9b3d4731edbb 191 }
WFKnight 0:9b3d4731edbb 192
WFKnight 0:9b3d4731edbb 193 #else
WFKnight 0:9b3d4731edbb 194 private:
WFKnight 0:9b3d4731edbb 195 /**
WFKnight 0:9b3d4731edbb 196 * Declare copy constructor as private, any attempt to copy construct
WFKnight 0:9b3d4731edbb 197 * a NonCopyable will fail at compile time.
WFKnight 0:9b3d4731edbb 198 */
WFKnight 0:9b3d4731edbb 199 NonCopyable(const NonCopyable&);
WFKnight 0:9b3d4731edbb 200
WFKnight 0:9b3d4731edbb 201 /**
WFKnight 0:9b3d4731edbb 202 * Declare copy assignment operator as private, any attempt to copy assign
WFKnight 0:9b3d4731edbb 203 * a NonCopyable will fail at compile time.
WFKnight 0:9b3d4731edbb 204 */
WFKnight 0:9b3d4731edbb 205 NonCopyable& operator=(const NonCopyable&);
WFKnight 0:9b3d4731edbb 206 #endif
WFKnight 0:9b3d4731edbb 207 };
WFKnight 0:9b3d4731edbb 208
WFKnight 0:9b3d4731edbb 209 } // namespace mbed
WFKnight 0:9b3d4731edbb 210
WFKnight 0:9b3d4731edbb 211 #endif /* MBED_NONCOPYABLE_H_ */