104124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi#ifndef _TCUMAYBE_HPP
204124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi#define _TCUMAYBE_HPP
304124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi/*-------------------------------------------------------------------------
404124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi * drawElements Quality Program Tester Core
504124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi * ----------------------------------------
604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi *
704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi * Copyright 2015 The Android Open Source Project
804124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi *
904124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi * Licensed under the Apache License, Version 2.0 (the "License");
1004124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi * you may not use this file except in compliance with the License.
1104124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi * You may obtain a copy of the License at
1204124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi *
1304124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi *      http://www.apache.org/licenses/LICENSE-2.0
1404124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi *
1504124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi * Unless required by applicable law or agreed to in writing, software
1604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi * distributed under the License is distributed on an "AS IS" BASIS,
1704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1804124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi * See the License for the specific language governing permissions and
1904124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi * limitations under the License.
2004124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi *
2104124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi *//*!
2204124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi * \file
2304124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi * \brief Template for values that may not exist.
2404124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi *//*--------------------------------------------------------------------*/
2504124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
2604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi#include "tcuDefs.hpp"
2704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
2804124860027485485618ab2e3117c3fe77ae8416Mika Isojärvinamespace tcu
2904124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi{
3004124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
3104124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi// \note Type T is always aligned to same alignment as deUint64.
3204124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi// \note This type always uses at least sizeof(T*) + sizeof(deUint64) of memory.
3304124860027485485618ab2e3117c3fe77ae8416Mika Isojärvitemplate<typename T>
3404124860027485485618ab2e3117c3fe77ae8416Mika Isojärviclass Maybe
3504124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi{
3604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvipublic:
3704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi				Maybe			(void);
3804124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi				~Maybe			(void);
3904124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
4004124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi				Maybe			(const T& val);
4104124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	Maybe<T>&	operator=		(const T& val);
4204124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
4304124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi				Maybe			(const Maybe<T>& other);
4404124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	Maybe<T>&	operator=		(const Maybe<T>& other);
4504124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
4604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	const T&	get				(void) const;
4704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	const T&	operator*		(void) const { return get(); }
4804124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
4904124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	const T*	operator->		(void) const;
50ab2112857be486f19caf4b50e6211150bd7613b4Pyry Haulos				operator bool	(void) const { return !!m_ptr; }
5104124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
5204124860027485485618ab2e3117c3fe77ae8416Mika Isojärviprivate:
5304124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	T*				m_ptr;
5404124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
5504124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	union
5604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	{
5704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi		deUint8		m_data[sizeof(T)];
5804124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi		deUint64	m_align;
5904124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	};
6093df37596ea66700965094b3aa2830cf4f2ca5aaJarkko Pöyry} DE_WARN_UNUSED_TYPE;
6104124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
6204124860027485485618ab2e3117c3fe77ae8416Mika Isojärvitemplate<typename T>
6304124860027485485618ab2e3117c3fe77ae8416Mika IsojärviMaybe<T> nothing (void)
6404124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi{
6504124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	return Maybe<T>();
6604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi}
6704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
6804124860027485485618ab2e3117c3fe77ae8416Mika Isojärvitemplate<typename T>
697c39ad32b468dae7262aca39fa2c4fdd33dd0027Mika IsojärviMaybe<T> just (const T& value)
707c39ad32b468dae7262aca39fa2c4fdd33dd0027Mika Isojärvi{
717c39ad32b468dae7262aca39fa2c4fdd33dd0027Mika Isojärvi	return Maybe<T>(value);
727c39ad32b468dae7262aca39fa2c4fdd33dd0027Mika Isojärvi}
737c39ad32b468dae7262aca39fa2c4fdd33dd0027Mika Isojärvi
747c39ad32b468dae7262aca39fa2c4fdd33dd0027Mika Isojärvitemplate<typename T>
7504124860027485485618ab2e3117c3fe77ae8416Mika IsojärviMaybe<T>::Maybe (void)
7604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	: m_ptr (DE_NULL)
7704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi{
7804124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi}
7904124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
8004124860027485485618ab2e3117c3fe77ae8416Mika Isojärvitemplate<typename T>
8104124860027485485618ab2e3117c3fe77ae8416Mika IsojärviMaybe<T>::~Maybe (void)
8204124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi{
8304124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	if (m_ptr)
8404124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi		m_ptr->~T();
8504124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi}
8604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
8704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvitemplate<typename T>
8804124860027485485618ab2e3117c3fe77ae8416Mika IsojärviMaybe<T>::Maybe (const T& val)
8904124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	: m_ptr (DE_NULL)
9004124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi{
9104124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	m_ptr = new(m_data)T(val);
9204124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi}
9304124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
9404124860027485485618ab2e3117c3fe77ae8416Mika Isojärvitemplate<typename T>
9504124860027485485618ab2e3117c3fe77ae8416Mika IsojärviMaybe<T>& Maybe<T>::operator= (const T& val)
9604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi{
9704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	if (m_ptr)
9804124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi		m_ptr->~T();
9904124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
10004124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	m_ptr = new(m_data)T(val);
10104124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
10204124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	return *this;
10304124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi}
10404124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
10504124860027485485618ab2e3117c3fe77ae8416Mika Isojärvitemplate<typename T>
10604124860027485485618ab2e3117c3fe77ae8416Mika IsojärviMaybe<T>::Maybe (const Maybe<T>& other)
10704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	: m_ptr (DE_NULL)
10804124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi{
10904124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	if (other.m_ptr)
11004124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi		m_ptr = new(m_data)T(*other.m_ptr);
11104124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi}
11204124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
11304124860027485485618ab2e3117c3fe77ae8416Mika Isojärvitemplate<typename T>
11404124860027485485618ab2e3117c3fe77ae8416Mika IsojärviMaybe<T>& Maybe<T>::operator= (const Maybe<T>& other)
11504124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi{
11604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	if (this == &other)
11704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi		return *this;
11804124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
11904124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	if (m_ptr)
12004124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi		m_ptr->~T();
12104124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
12204124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	if (other.m_ptr)
12304124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi		m_ptr = new(m_data)T(*other.m_ptr);
12404124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	else
12504124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi		m_ptr = DE_NULL;
12604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
12704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	return *this;
12804124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi}
12904124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
13004124860027485485618ab2e3117c3fe77ae8416Mika Isojärvitemplate<typename T>
13104124860027485485618ab2e3117c3fe77ae8416Mika Isojärviconst T* Maybe<T>::operator-> (void) const
13204124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi{
13304124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	DE_ASSERT(m_ptr);
13404124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	return m_ptr;
13504124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi}
13604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
13704124860027485485618ab2e3117c3fe77ae8416Mika Isojärvitemplate<typename T>
13804124860027485485618ab2e3117c3fe77ae8416Mika Isojärviconst T& Maybe<T>::get (void) const
13904124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi{
14004124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	DE_ASSERT(m_ptr);
14104124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi	return *m_ptr;
14204124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi}
14304124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
14404124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi} // tcu
14504124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi
14604124860027485485618ab2e3117c3fe77ae8416Mika Isojärvi#endif // _TCUMAYBE_HPP
147