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