1 /* 2 * 3 * Copyright 2019, The Android Open Source Project 4 * 5 * Licensed under the Apache License, Version 2.0 (the "License"); 6 * you may not use this file except in compliance with the License. 7 * You may obtain a copy of the License at 8 * 9 * http://www.apache.org/licenses/LICENSE-2.0 10 * 11 * Unless required by applicable law or agreed to in writing, software 12 * distributed under the License is distributed on an "AS IS" BASIS, 13 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 14 * See the License for the specific language governing permissions and 15 * limitations under the License. 16 */ 17 18 #ifndef LIBTEEUI_INCLUDE_TEEUI_ERROR_H_ 19 #define LIBTEEUI_INCLUDE_TEEUI_ERROR_H_ 20 21 #include "log.h" 22 #include <stdint.h> 23 24 namespace teeui { 25 26 class Error { 27 public: 28 enum error_e : uint32_t { 29 OK, 30 NotInitialized, 31 FaceNotLoaded, 32 CharSizeNotSet, 33 GlyphNotLoaded, 34 GlyphNotRendered, 35 GlyphNotExtracted, 36 UnsupportedPixelFormat, 37 OutOfBoundsDrawing, 38 BBoxComputation, 39 OutOfMemory, 40 Localization, 41 }; 42 Error()43 constexpr Error() noexcept : v_(OK) {} Error(error_e v)44 constexpr Error(error_e v) noexcept : v_(v) {} 45 constexpr Error(Error&&) noexcept = default; 46 constexpr Error(const Error&) noexcept = default; 47 48 Error& operator=(error_e v) { 49 v_ = v; 50 return *this; 51 } 52 Error& operator=(const Error& other) { 53 v_ = other.v_; 54 return *this; 55 } 56 57 /** 58 * Evaluates to true if this represents an error condition. 59 * Consider a function Error foo(), use the following pattern to handle the error. 60 * if (auto error = foo()) { <handle error here> } 61 */ 62 operator bool() const { return v_ != OK; } 63 64 Error operator||(const Error& rhs) const { return *this ? *this : rhs; } 65 66 inline bool operator==(error_e v) const { return v_ == v; }; 67 inline bool operator!=(error_e v) const { return v_ != v; }; 68 code()69 constexpr error_e code() const { return v_; } 70 71 private: 72 error_e v_; 73 }; 74 75 #ifdef TEEUI_DO_LOG_DEBUG 76 // keep this in the header, so the test can switch it on without switching it on in the static 77 // library 78 [[maybe_unused]] static std::ostream& operator<<(std::ostream& out, Error e) { 79 switch (e.code()) { 80 case Error::OK: 81 return out << "teeui::Error::OK"; 82 case Error::NotInitialized: 83 return out << "teeui::Error::NotInitialized"; 84 case Error::FaceNotLoaded: 85 return out << "teeui::Error::FaceNotLoaded"; 86 case Error::CharSizeNotSet: 87 return out << "teeui::Error::CharSizeNotSet"; 88 case Error::GlyphNotLoaded: 89 return out << "teeui::Error::GlyphNotLoaded"; 90 case Error::GlyphNotRendered: 91 return out << "teeui::Error::GlyphNotRendered"; 92 case Error::GlyphNotExtracted: 93 return out << "teeui::Error::GlyphNotExtracted"; 94 case Error::UnsupportedPixelFormat: 95 return out << "teeui::Error::UnsupportedPixelFormat"; 96 case Error::OutOfBoundsDrawing: 97 return out << "teeui::Error::OutOfBoundsDrawing"; 98 case Error::BBoxComputation: 99 return out << "teeui::Error::BBoxComputation"; 100 case Error::OutOfMemory: 101 return out << "teeui::Error::OutOfMemory"; 102 default: 103 return out << "Invalid teeui::Error Code"; 104 } 105 } 106 #endif 107 108 } // namespace teeui 109 110 #endif // LIBTEEUI_INCLUDE_TEEUI_ERROR_H_ 111