diff options
Diffstat (limited to 'src/common/register_set.h')
| -rw-r--r-- | src/common/register_set.h | 163 |
1 files changed, 0 insertions, 163 deletions
diff --git a/src/common/register_set.h b/src/common/register_set.h deleted file mode 100644 index ba19a2614..000000000 --- a/src/common/register_set.h +++ /dev/null | |||
| @@ -1,163 +0,0 @@ | |||
| 1 | // Copyright 2014 Citra Emulator Project | ||
| 2 | // Licensed under GPLv2 | ||
| 3 | // Refer to the license.txt file included. | ||
| 4 | |||
| 5 | #pragma once | ||
| 6 | |||
| 7 | // Copyright 2014 Tony Wasserka | ||
| 8 | // All rights reserved. | ||
| 9 | // | ||
| 10 | // Redistribution and use in source and binary forms, with or without | ||
| 11 | // modification, are permitted provided that the following conditions are met: | ||
| 12 | // | ||
| 13 | // * Redistributions of source code must retain the above copyright | ||
| 14 | // notice, this list of conditions and the following disclaimer. | ||
| 15 | // * Redistributions in binary form must reproduce the above copyright | ||
| 16 | // notice, this list of conditions and the following disclaimer in the | ||
| 17 | // documentation and/or other materials provided with the distribution. | ||
| 18 | // * Neither the name of the owner nor the names of its contributors may | ||
| 19 | // be used to endorse or promote products derived from this software | ||
| 20 | // without specific prior written permission. | ||
| 21 | // | ||
| 22 | // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| 23 | // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| 24 | // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| 25 | // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| 26 | // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| 27 | // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| 28 | // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| 29 | // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| 30 | // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| 31 | // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| 32 | // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| 33 | |||
| 34 | /* | ||
| 35 | * Standardized way to define a group of registers and corresponding data structures. To define | ||
| 36 | * a new register set, first define struct containing an enumeration called "Id" containing | ||
| 37 | * all register IDs and a template struct called "Struct". Specialize the Struct struct for any | ||
| 38 | * register ID which needs to be accessed in a specialized way. You can then declare the object | ||
| 39 | * containing all register values using the RegisterSet<BaseType, DefiningStruct> type, where | ||
| 40 | * BaseType is the underlying type of each register (e.g. u32). | ||
| 41 | * Of course, you'll usually want to implement the Struct template such that they are of the same | ||
| 42 | * size as BaseType. However, it's also possible to make it larger, e.g. when you want to describe | ||
| 43 | * multiple registers with the same structure. | ||
| 44 | * | ||
| 45 | * Example: | ||
| 46 | * | ||
| 47 | * struct Regs { | ||
| 48 | * enum Id : u32 { | ||
| 49 | * Value1 = 0, | ||
| 50 | * Value2 = 1, | ||
| 51 | * Value3 = 2, | ||
| 52 | * NumIds = 3 | ||
| 53 | * }; | ||
| 54 | * | ||
| 55 | * // declare register definition structures | ||
| 56 | * template<Id id> | ||
| 57 | * struct Struct; | ||
| 58 | * }; | ||
| 59 | * | ||
| 60 | * // Define register set object | ||
| 61 | * RegisterSet<u32, CommandIds> registers; | ||
| 62 | * | ||
| 63 | * // define register definition structures | ||
| 64 | * template<> | ||
| 65 | * struct Regs::Struct<Regs::Value1> { | ||
| 66 | * union { | ||
| 67 | * BitField<0, 4, u32> some_field; | ||
| 68 | * BitField<4, 3, u32> some_other_field; | ||
| 69 | * }; | ||
| 70 | * }; | ||
| 71 | * | ||
| 72 | * Usage in external code (within SomeNamespace scope): | ||
| 73 | * | ||
| 74 | * For a register which maps to a single index: | ||
| 75 | * registers.Get<Regs::Value1>().some_field = some_value; | ||
| 76 | * | ||
| 77 | * For a register which maps to different indices, e.g. a group of similar registers | ||
| 78 | * registers.Get<Regs::Value1>(index).some_field = some_value; | ||
| 79 | * | ||
| 80 | * | ||
| 81 | * @tparam BaseType Base type used for storing individual registers, e.g. u32 | ||
| 82 | * @tparam RegDefinition Class defining an enumeration called "Id" and a template<Id id> struct, as described above. | ||
| 83 | * @note RegDefinition::Id needs to have an enum value called NumIds defining the number of registers to be allocated. | ||
| 84 | */ | ||
| 85 | template<typename BaseType, typename RegDefinition> | ||
| 86 | struct RegisterSet { | ||
| 87 | // Register IDs | ||
| 88 | using Id = typename RegDefinition::Id; | ||
| 89 | |||
| 90 | // type used for *this | ||
| 91 | using ThisType = RegisterSet<BaseType, RegDefinition>; | ||
| 92 | |||
| 93 | // Register definition structs, defined in RegDefinition | ||
| 94 | template<Id id> | ||
| 95 | using Struct = typename RegDefinition::template Struct<id>; | ||
| 96 | |||
| 97 | |||
| 98 | /* | ||
| 99 | * Lookup register with the given id and return it as the corresponding structure type. | ||
| 100 | * @note This just forwards the arguments to Get(Id). | ||
| 101 | */ | ||
| 102 | template<Id id> | ||
| 103 | const Struct<id>& Get() const { | ||
| 104 | return Get<id>(id); | ||
| 105 | } | ||
| 106 | |||
| 107 | /* | ||
| 108 | * Lookup register with the given id and return it as the corresponding structure type. | ||
| 109 | * @note This just forwards the arguments to Get(Id). | ||
| 110 | */ | ||
| 111 | template<Id id> | ||
| 112 | Struct<id>& Get() { | ||
| 113 | return Get<id>(id); | ||
| 114 | } | ||
| 115 | |||
| 116 | /* | ||
| 117 | * Lookup register with the given index and return it as the corresponding structure type. | ||
| 118 | * @todo Is this portable with regards to structures larger than BaseType? | ||
| 119 | * @note if index==id, you don't need to specify the function parameter. | ||
| 120 | */ | ||
| 121 | template<Id id> | ||
| 122 | const Struct<id>& Get(const Id& index) const { | ||
| 123 | const int idx = static_cast<size_t>(index); | ||
| 124 | return *reinterpret_cast<const Struct<id>*>(&raw[idx]); | ||
| 125 | } | ||
| 126 | |||
| 127 | /* | ||
| 128 | * Lookup register with the given index and return it as the corresponding structure type. | ||
| 129 | * @note This just forwards the arguments to the const version of Get(Id). | ||
| 130 | * @note if index==id, you don't need to specify the function parameter. | ||
| 131 | */ | ||
| 132 | template<Id id> | ||
| 133 | Struct<id>& Get(const Id& index) { | ||
| 134 | return const_cast<Struct<id>&>(GetThis().Get<id>(index)); | ||
| 135 | } | ||
| 136 | |||
| 137 | /* | ||
| 138 | * Plain array access. | ||
| 139 | * @note If you want to have this casted to a register defininition struct, use Get() instead. | ||
| 140 | */ | ||
| 141 | const BaseType& operator[] (const Id& id) const { | ||
| 142 | return raw[static_cast<size_t>(id)]; | ||
| 143 | } | ||
| 144 | |||
| 145 | /* | ||
| 146 | * Plain array access. | ||
| 147 | * @note If you want to have this casted to a register defininition struct, use Get() instead. | ||
| 148 | * @note This operator just forwards its argument to the const version. | ||
| 149 | */ | ||
| 150 | BaseType& operator[] (const Id& id) { | ||
| 151 | return const_cast<BaseType&>(GetThis()[id]); | ||
| 152 | } | ||
| 153 | |||
| 154 | private: | ||
| 155 | /* | ||
| 156 | * Returns a const reference to "this". | ||
| 157 | */ | ||
| 158 | const ThisType& GetThis() const { | ||
| 159 | return static_cast<const ThisType&>(*this); | ||
| 160 | } | ||
| 161 | |||
| 162 | BaseType raw[Id::NumIds]; | ||
| 163 | }; | ||