1f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi#ifndef _TCUEITHER_HPP 2f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi#define _TCUEITHER_HPP 3f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi/*------------------------------------------------------------------------- 4f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * drawElements Quality Program Tester Core 5f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * ---------------------------------------- 6f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * 7f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * Copyright 2015 The Android Open Source Project 8f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * 9f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * Licensed under the Apache License, Version 2.0 (the "License"); 10f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * you may not use this file except in compliance with the License. 11f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * You may obtain a copy of the License at 12f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * 13f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * http://www.apache.org/licenses/LICENSE-2.0 14f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * 15f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * Unless required by applicable law or agreed to in writing, software 16f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * distributed under the License is distributed on an "AS IS" BASIS, 17f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * See the License for the specific language governing permissions and 19f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * limitations under the License. 20f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * 21f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi *//*! 22f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * \file 23f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * \brief Template class that is either type of First or Second. 24f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi *//*--------------------------------------------------------------------*/ 25f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 26f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi#include "tcuDefs.hpp" 27f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 28f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvinamespace tcu 29f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 30f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 31f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi/*--------------------------------------------------------------------*//*! 32f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * \brief Object containing Either First or Second type of object 33f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * 34f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * \note Type First and Second are always aligned to same alignment as 35a15e7d7f566d93c76ca90171eb728e3d1cd82378Pyry Haulos * deUint64. 36f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi * \note This type always uses at least sizeof(bool) + max(sizeof(First*), 37a15e7d7f566d93c76ca90171eb728e3d1cd82378Pyry Haulos * sizeof(Second*)) + sizeof(deUint64) of memory. 38f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi *//*--------------------------------------------------------------------*/ 39f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 40f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärviclass Either 41f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 42f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvipublic: 43f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi Either (const First& first); 44f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi Either (const Second& second); 45f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi ~Either (void); 46f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 47f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi Either (const Either<First, Second>& other); 48f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi Either& operator= (const Either<First, Second>& other); 49f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 50f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi Either& operator= (const First& first); 51f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi Either& operator= (const Second& second); 52f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 53f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi bool isFirst (void) const; 54f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi bool isSecond (void) const; 55f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 56f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi const First& getFirst (void) const; 57f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi const Second& getSecond (void) const; 58f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 59f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi template<typename Type> 60f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi const Type& get (void) const; 61f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 62f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi template<typename Type> 63f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi bool is (void) const; 64f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 65f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärviprivate: 66f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi void release (void); 67f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 68f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi bool m_isFirst; 69f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 70f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi union 71f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi { 72f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi First* m_first; 73f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi Second* m_second; 74f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi }; 75f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 76f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi union 77f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi { 78f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi deUint8 m_data[sizeof(First) > sizeof(Second) ? sizeof(First) : sizeof(Second)]; 79f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi deUint64 m_align; 80f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi }; 8193df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE; 82f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 83f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvinamespace EitherDetail 84f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 85f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 86f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename Type, typename First, typename Second> 87f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvistruct Get; 88f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 89f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 90f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvistruct Get<First, First, Second> 91f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 92f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi static const First& get (const Either<First, Second>& either) 93f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi { 94f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return either.getFirst(); 95f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi } 96f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi}; 97f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 98f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 99f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvistruct Get<Second, First, Second> 100f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 101f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi static const Second& get (const Either<First, Second>& either) 102f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi { 103f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return either.getSecond(); 104f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi } 105f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi}; 106f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 107f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename Type, typename First, typename Second> 108f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärviconst Type& get (const Either<First, Second>& either) 109f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 110f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return Get<Type, First, Second>::get(either); 111f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 112f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 113f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename Type, typename First, typename Second> 114f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvistruct Is; 115f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 116f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 117f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvistruct Is<First, First, Second> 118f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 119f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi static bool is (const Either<First, Second>& either) 120f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi { 121f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return either.isFirst(); 122f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi } 123f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi}; 124f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 125f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 126f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvistruct Is<Second, First, Second> 127f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 128f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi static bool is (const Either<First, Second>& either) 129f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi { 130f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return either.isSecond(); 131f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi } 132f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi}; 133f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 134f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename Type, typename First, typename Second> 135f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvibool is (const Either<First, Second>& either) 136f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 137f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return Is<Type, First, Second>::is(either); 138f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 139f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 140f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} // EitherDetail 141f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 142f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 143f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvivoid Either<First, Second>::release (void) 144f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 145f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi if (m_isFirst) 146f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_first->~First(); 147f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi else 148f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_second->~Second(); 149f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 150f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_isFirst = true; 151f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_first = DE_NULL; 152f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 153f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 154f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 155f824ffe1538233bb05416cb5c7bd7167756c7314Mika IsojärviEither<First, Second>::Either (const First& first) 156f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi : m_isFirst (true) 157f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 158f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_first = new(m_data)First(first); 159f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 160f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 161f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 162f824ffe1538233bb05416cb5c7bd7167756c7314Mika IsojärviEither<First, Second>::Either (const Second& second) 163f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi : m_isFirst (false) 164f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 165f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_second = new(m_data)Second(second); 166f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 167f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 168f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 169f824ffe1538233bb05416cb5c7bd7167756c7314Mika IsojärviEither<First, Second>::~Either (void) 170f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 171f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi release(); 172f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 173f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 174f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 175f824ffe1538233bb05416cb5c7bd7167756c7314Mika IsojärviEither<First, Second>::Either (const Either<First, Second>& other) 176f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi : m_isFirst (other.m_isFirst) 177f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 178f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi if (m_isFirst) 179f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_first = new(m_data)First(*other.m_first); 180f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi else 181f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_second = new(m_data)Second(*other.m_second); 182f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 183f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 184f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 185f824ffe1538233bb05416cb5c7bd7167756c7314Mika IsojärviEither<First, Second>& Either<First, Second>::operator= (const Either<First, Second>& other) 186f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 187f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi if (this == &other) 188f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return *this; 189f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 190f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi release(); 191f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 192f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_isFirst = other.m_isFirst; 193f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 194f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi if (m_isFirst) 195f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_first = new(m_data)First(*other.m_first); 196f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi else 197f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_second = new(m_data)Second(*other.m_second); 198f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 199f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return *this; 200f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 201f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 202f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 203f824ffe1538233bb05416cb5c7bd7167756c7314Mika IsojärviEither<First, Second>& Either<First, Second>::operator= (const First& first) 204f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 205f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi release(); 206f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 207f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_isFirst = true; 208f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_first = new(m_data)First(first); 209f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 210f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return *this; 211f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 212f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 213f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 214f824ffe1538233bb05416cb5c7bd7167756c7314Mika IsojärviEither<First, Second>& Either<First, Second>::operator= (const Second& second) 215f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 216f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi release(); 217f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 218f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_isFirst = false; 219f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi m_second = new(m_data)Second(second); 220f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 221f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return *this; 222f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 223f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 224f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 225f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvibool Either<First, Second>::isFirst (void) const 226f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 227f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return m_isFirst; 228f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 229f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 230f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 231f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvibool Either<First, Second>::isSecond (void) const 232f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 233f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return !m_isFirst; 234f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 235f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 236f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 237f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärviconst First& Either<First, Second>::getFirst (void) const 238f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 239f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi DE_ASSERT(isFirst()); 240f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return *m_first; 241f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 242f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 243f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 244f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärviconst Second& Either<First, Second>::getSecond (void) const 245f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 246f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi DE_ASSERT(isSecond()); 247f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return *m_second; 248f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 249f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 250f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 251f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename Type> 252f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärviconst Type& Either<First, Second>::get (void) const 253f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 254f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return EitherDetail::get<Type, First, Second>(*this); 255f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 256f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 257f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename First, typename Second> 258f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvitemplate<typename Type> 259f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvibool Either<First, Second>::is (void) const 260f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi{ 261f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi return EitherDetail::is<Type, First, Second>(*this); 262f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} 263f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 264f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvivoid Either_selfTest (void); 265f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 266f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi} // tcu 267f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi 268f824ffe1538233bb05416cb5c7bd7167756c7314Mika Isojärvi#endif // _TCUEITHER_HPP 269