1e5c31af7Sopenharmony_ci#ifndef _TCUMAYBE_HPP 2e5c31af7Sopenharmony_ci#define _TCUMAYBE_HPP 3e5c31af7Sopenharmony_ci/*------------------------------------------------------------------------- 4e5c31af7Sopenharmony_ci * drawElements Quality Program Tester Core 5e5c31af7Sopenharmony_ci * ---------------------------------------- 6e5c31af7Sopenharmony_ci * 7e5c31af7Sopenharmony_ci * Copyright 2015 The Android Open Source Project 8e5c31af7Sopenharmony_ci * 9e5c31af7Sopenharmony_ci * Licensed under the Apache License, Version 2.0 (the "License"); 10e5c31af7Sopenharmony_ci * you may not use this file except in compliance with the License. 11e5c31af7Sopenharmony_ci * You may obtain a copy of the License at 12e5c31af7Sopenharmony_ci * 13e5c31af7Sopenharmony_ci * http://www.apache.org/licenses/LICENSE-2.0 14e5c31af7Sopenharmony_ci * 15e5c31af7Sopenharmony_ci * Unless required by applicable law or agreed to in writing, software 16e5c31af7Sopenharmony_ci * distributed under the License is distributed on an "AS IS" BASIS, 17e5c31af7Sopenharmony_ci * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 18e5c31af7Sopenharmony_ci * See the License for the specific language governing permissions and 19e5c31af7Sopenharmony_ci * limitations under the License. 20e5c31af7Sopenharmony_ci * 21e5c31af7Sopenharmony_ci *//*! 22e5c31af7Sopenharmony_ci * \file 23e5c31af7Sopenharmony_ci * \brief Template for values that may not exist. 24e5c31af7Sopenharmony_ci *//*--------------------------------------------------------------------*/ 25e5c31af7Sopenharmony_ci 26e5c31af7Sopenharmony_ci#include "tcuDefs.hpp" 27e5c31af7Sopenharmony_ci 28e5c31af7Sopenharmony_cinamespace tcu 29e5c31af7Sopenharmony_ci{ 30e5c31af7Sopenharmony_ci 31e5c31af7Sopenharmony_ci// Empty struct used to initialize Maybe objects without providing the type explicitly. 32e5c31af7Sopenharmony_cistruct Nothing_T { 33e5c31af7Sopenharmony_ci explicit constexpr Nothing_T (int) {} 34e5c31af7Sopenharmony_ci}; 35e5c31af7Sopenharmony_ciconstexpr Nothing_T Nothing (0); 36e5c31af7Sopenharmony_ci 37e5c31af7Sopenharmony_ci// \note Type T is always aligned to same alignment as deUint64. 38e5c31af7Sopenharmony_ci// \note This type always uses at least sizeof(T*) + sizeof(deUint64) of memory. 39e5c31af7Sopenharmony_citemplate<typename T> 40e5c31af7Sopenharmony_ciclass Maybe 41e5c31af7Sopenharmony_ci{ 42e5c31af7Sopenharmony_cipublic: 43e5c31af7Sopenharmony_ci Maybe (void); 44e5c31af7Sopenharmony_ci Maybe (const Nothing_T&); 45e5c31af7Sopenharmony_ci ~Maybe (void); 46e5c31af7Sopenharmony_ci 47e5c31af7Sopenharmony_ci Maybe (const T& val); 48e5c31af7Sopenharmony_ci Maybe<T>& operator= (const T& val); 49e5c31af7Sopenharmony_ci 50e5c31af7Sopenharmony_ci Maybe (const Maybe<T>& other); 51e5c31af7Sopenharmony_ci Maybe<T>& operator= (const Maybe<T>& other); 52e5c31af7Sopenharmony_ci 53e5c31af7Sopenharmony_ci const T& get (void) const; 54e5c31af7Sopenharmony_ci T& get (void); 55e5c31af7Sopenharmony_ci const T& operator* (void) const { return get(); } 56e5c31af7Sopenharmony_ci T& operator* (void) { return get(); } 57e5c31af7Sopenharmony_ci 58e5c31af7Sopenharmony_ci const T* operator-> (void) const; 59e5c31af7Sopenharmony_ci T* operator-> (void); 60e5c31af7Sopenharmony_ci operator bool (void) const { return !!m_ptr; } 61e5c31af7Sopenharmony_ci 62e5c31af7Sopenharmony_ciprivate: 63e5c31af7Sopenharmony_ci T* m_ptr; 64e5c31af7Sopenharmony_ci 65e5c31af7Sopenharmony_ci union 66e5c31af7Sopenharmony_ci { 67e5c31af7Sopenharmony_ci deUint8 m_data[sizeof(T)]; 68e5c31af7Sopenharmony_ci deUint64 m_align; 69e5c31af7Sopenharmony_ci }; 70e5c31af7Sopenharmony_ci} DE_WARN_UNUSED_TYPE; 71e5c31af7Sopenharmony_ci 72e5c31af7Sopenharmony_citemplate<typename T> 73e5c31af7Sopenharmony_ciMaybe<T> nothing (void) 74e5c31af7Sopenharmony_ci{ 75e5c31af7Sopenharmony_ci return Maybe<T>(); 76e5c31af7Sopenharmony_ci} 77e5c31af7Sopenharmony_ci 78e5c31af7Sopenharmony_citemplate<typename T> 79e5c31af7Sopenharmony_ciMaybe<T> just (const T& value) 80e5c31af7Sopenharmony_ci{ 81e5c31af7Sopenharmony_ci return Maybe<T>(value); 82e5c31af7Sopenharmony_ci} 83e5c31af7Sopenharmony_ci 84e5c31af7Sopenharmony_citemplate<typename T> 85e5c31af7Sopenharmony_ciMaybe<T>::Maybe (void) 86e5c31af7Sopenharmony_ci : m_ptr (nullptr) 87e5c31af7Sopenharmony_ci{ 88e5c31af7Sopenharmony_ci} 89e5c31af7Sopenharmony_ci 90e5c31af7Sopenharmony_citemplate<typename T> 91e5c31af7Sopenharmony_ciMaybe<T>::Maybe (const Nothing_T&) 92e5c31af7Sopenharmony_ci : m_ptr (nullptr) 93e5c31af7Sopenharmony_ci{ 94e5c31af7Sopenharmony_ci} 95e5c31af7Sopenharmony_ci 96e5c31af7Sopenharmony_citemplate<typename T> 97e5c31af7Sopenharmony_ciMaybe<T>::~Maybe (void) 98e5c31af7Sopenharmony_ci{ 99e5c31af7Sopenharmony_ci if (m_ptr) 100e5c31af7Sopenharmony_ci m_ptr->~T(); 101e5c31af7Sopenharmony_ci} 102e5c31af7Sopenharmony_ci 103e5c31af7Sopenharmony_citemplate<typename T> 104e5c31af7Sopenharmony_ciMaybe<T>::Maybe (const T& val) 105e5c31af7Sopenharmony_ci : m_ptr (nullptr) 106e5c31af7Sopenharmony_ci{ 107e5c31af7Sopenharmony_ci m_ptr = new(m_data)T(val); 108e5c31af7Sopenharmony_ci} 109e5c31af7Sopenharmony_ci 110e5c31af7Sopenharmony_citemplate<typename T> 111e5c31af7Sopenharmony_ciMaybe<T>& Maybe<T>::operator= (const T& val) 112e5c31af7Sopenharmony_ci{ 113e5c31af7Sopenharmony_ci if (m_ptr) 114e5c31af7Sopenharmony_ci m_ptr->~T(); 115e5c31af7Sopenharmony_ci 116e5c31af7Sopenharmony_ci m_ptr = new(m_data)T(val); 117e5c31af7Sopenharmony_ci 118e5c31af7Sopenharmony_ci return *this; 119e5c31af7Sopenharmony_ci} 120e5c31af7Sopenharmony_ci 121e5c31af7Sopenharmony_citemplate<typename T> 122e5c31af7Sopenharmony_ciMaybe<T>::Maybe (const Maybe<T>& other) 123e5c31af7Sopenharmony_ci : m_ptr (nullptr) 124e5c31af7Sopenharmony_ci{ 125e5c31af7Sopenharmony_ci if (other.m_ptr) 126e5c31af7Sopenharmony_ci m_ptr = new(m_data)T(*other.m_ptr); 127e5c31af7Sopenharmony_ci} 128e5c31af7Sopenharmony_ci 129e5c31af7Sopenharmony_citemplate<typename T> 130e5c31af7Sopenharmony_ciMaybe<T>& Maybe<T>::operator= (const Maybe<T>& other) 131e5c31af7Sopenharmony_ci{ 132e5c31af7Sopenharmony_ci if (this == &other) 133e5c31af7Sopenharmony_ci return *this; 134e5c31af7Sopenharmony_ci 135e5c31af7Sopenharmony_ci if (m_ptr) 136e5c31af7Sopenharmony_ci m_ptr->~T(); 137e5c31af7Sopenharmony_ci 138e5c31af7Sopenharmony_ci if (other.m_ptr) 139e5c31af7Sopenharmony_ci m_ptr = new(m_data)T(*other.m_ptr); 140e5c31af7Sopenharmony_ci else 141e5c31af7Sopenharmony_ci m_ptr = nullptr; 142e5c31af7Sopenharmony_ci 143e5c31af7Sopenharmony_ci return *this; 144e5c31af7Sopenharmony_ci} 145e5c31af7Sopenharmony_ci 146e5c31af7Sopenharmony_citemplate<typename T> 147e5c31af7Sopenharmony_ciconst T* Maybe<T>::operator-> (void) const 148e5c31af7Sopenharmony_ci{ 149e5c31af7Sopenharmony_ci DE_ASSERT(m_ptr); 150e5c31af7Sopenharmony_ci return m_ptr; 151e5c31af7Sopenharmony_ci} 152e5c31af7Sopenharmony_ci 153e5c31af7Sopenharmony_citemplate<typename T> 154e5c31af7Sopenharmony_ciT* Maybe<T>::operator-> (void) 155e5c31af7Sopenharmony_ci{ 156e5c31af7Sopenharmony_ci DE_ASSERT(m_ptr); 157e5c31af7Sopenharmony_ci return m_ptr; 158e5c31af7Sopenharmony_ci} 159e5c31af7Sopenharmony_ci 160e5c31af7Sopenharmony_citemplate<typename T> 161e5c31af7Sopenharmony_ciconst T& Maybe<T>::get (void) const 162e5c31af7Sopenharmony_ci{ 163e5c31af7Sopenharmony_ci DE_ASSERT(m_ptr); 164e5c31af7Sopenharmony_ci return *m_ptr; 165e5c31af7Sopenharmony_ci} 166e5c31af7Sopenharmony_ci 167e5c31af7Sopenharmony_citemplate<typename T> 168e5c31af7Sopenharmony_ciT& Maybe<T>::get (void) 169e5c31af7Sopenharmony_ci{ 170e5c31af7Sopenharmony_ci DE_ASSERT(m_ptr); 171e5c31af7Sopenharmony_ci return *m_ptr; 172e5c31af7Sopenharmony_ci} 173e5c31af7Sopenharmony_ci 174e5c31af7Sopenharmony_ci} // tcu 175e5c31af7Sopenharmony_ci 176e5c31af7Sopenharmony_ci#endif // _TCUMAYBE_HPP 177