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