From ad11c46792cd18f8096d770daaa99507dabc8055 Mon Sep 17 00:00:00 2001 From: Ryan Pavlik Date: Tue, 28 Jun 2016 15:46:12 -0500 Subject: [PATCH] Add return value header. --- CMakeLists.txt | 1 + ReturnValue.h | 110 +++++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 111 insertions(+) create mode 100644 ReturnValue.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 465e2a9..dce551d 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -95,6 +95,7 @@ add_library(ViveLoaderLib STATIC GetComponent.h GetProvider.h InterfaceTraits.h + ReturnValue.h SearchPathExtender.h ServerDriverHost.cpp ServerDriverHost.h diff --git a/ReturnValue.h b/ReturnValue.h new file mode 100644 index 0000000..c8035b0 --- /dev/null +++ b/ReturnValue.h @@ -0,0 +1,110 @@ +/** @file + @brief Header + + @date 2016 + + @author + Sensics, Inc. + +*/ + +// Copyright 2016 Sensics, Inc. +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +#ifndef INCLUDED_ReturnValue_h_GUID_B28A8BE9_541A_42AC_6925_C51C944B089E +#define INCLUDED_ReturnValue_h_GUID_B28A8BE9_541A_42AC_6925_C51C944B089E + +// Internal Includes +// - none + +// Library/third-party includes +// - none + +// Standard includes +// - none + +namespace osvr { +namespace vive { + struct ReturnValueBase { + ReturnValueBase() {} + ReturnValueBase(bool ok) : valid(ok) {} + + const bool valid = false; + + /// check validity by evaluating as a bool + explicit operator bool() const { return valid; } + }; + + template + struct ReturnValue : ReturnValueBase { + ReturnValue(ValueType const &val, ErrorCodeType err) + : ReturnValueBase(), value(val), errorCode(err) {} + ReturnValue(ValueType const &val, ErrorCodeType err, bool ok) + : ReturnValueBase(ok), value(val), errorCode(err) {} + + ValueType value = {}; + ErrorCodeType errorCode = {}; + + static ReturnValue makeError(ErrorCodeType err) { + return ReturnValue{{}, err}; + } + static ReturnValue makeValueFromRvalue(ValueType &&val) { + return ReturnValue{std::move(val), {}, true}; + } + static ReturnValue makeValue(ValueType val) { + return ReturnValue{val, {}, true}; + } + }; + + /// specialization for bool "error codes" + template + struct ReturnValue : ReturnValueBase { + ReturnValue(ValueType const &val) : ReturnValueBase(true), value(val) {} + ReturnValue(ValueType const &val, bool ok) + : ReturnValueBase(ok), value(val) {} + + ValueType value = {}; + + static ReturnValue makeError() { return ReturnValue{{}, false}; } + static ReturnValue makeValueFromRvalue(ValueType &&val) { + return ReturnValue{std::move(val), true}; + } + static ReturnValue makeValue(ValueType val) { + return ReturnValue{val, true}; + } + }; + + template + inline ReturnValue + makeGenericReturnValue(ValueType const &val, ErrorCodeType err, + bool valid) { + using type = ReturnValue; + return type(val, err, valid); + } + + template + inline ReturnValue makeError(ValueType const &val, + ErrorCodeType err) { + return makeGenericReturnValue(val, err, false); + } + + template + inline ReturnValue + makeReturnValue(ValueType const &val, ErrorCodeType err) { + return makeGenericReturnValue(val, err, true); + } + +} // namespace vive +} // namespace osvr +#endif // INCLUDED_ReturnValue_h_GUID_B28A8BE9_541A_42AC_6925_C51C944B089E