1b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Protocol Buffers - Google's data interchange format 2b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Copyright 2008 Google Inc. All rights reserved. 3b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// https://developers.google.com/protocol-buffers/ 4b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 5b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Redistribution and use in source and binary forms, with or without 6b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// modification, are permitted provided that the following conditions are 7b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// met: 8b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 9b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions of source code must retain the above copyright 10b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// notice, this list of conditions and the following disclaimer. 11b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Redistributions in binary form must reproduce the above 12b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// copyright notice, this list of conditions and the following disclaimer 13b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// in the documentation and/or other materials provided with the 14b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// distribution. 15b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// * Neither the name of Google Inc. nor the names of its 16b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// contributors may be used to endorse or promote products derived from 17b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// this software without specific prior written permission. 18b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 19b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 20b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 21b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 22b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 23b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 24b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 25b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 26b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 27b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 28b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 29b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 30b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 31b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// StatusOr<T> is the union of a Status object and a T 32b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// object. StatusOr models the concept of an object that is either a 33b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// usable value, or an error Status explaining why such a value is 34b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// not present. To this end, StatusOr<T> does not allow its Status 35b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// value to be Status::OK. Further, StatusOr<T*> does not allow the 36b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// contained pointer to be NULL. 37b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 38b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// The primary use-case for StatusOr<T> is as the return value of a 39b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// function which may fail. 40b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 41b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Example client usage for a StatusOr<T>, where T is not a pointer: 42b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 43b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// StatusOr<float> result = DoBigCalculationThatCouldFail(); 44b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// if (result.ok()) { 45b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// float answer = result.ValueOrDie(); 46b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// printf("Big calculation yielded: %f", answer); 47b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// } else { 48b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LOG(ERROR) << result.status(); 49b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// } 50b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 51b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Example client usage for a StatusOr<T*>: 52b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 53b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// StatusOr<Foo*> result = FooFactory::MakeNewFoo(arg); 54b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// if (result.ok()) { 55b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// std::unique_ptr<Foo> foo(result.ValueOrDie()); 56b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// foo->DoSomethingCool(); 57b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// } else { 58b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LOG(ERROR) << result.status(); 59b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// } 60b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 61b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Example client usage for a StatusOr<std::unique_ptr<T>>: 62b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 63b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// StatusOr<std::unique_ptr<Foo>> result = FooFactory::MakeNewFoo(arg); 64b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// if (result.ok()) { 65b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// std::unique_ptr<Foo> foo = result.ConsumeValueOrDie(); 66b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// foo->DoSomethingCool(); 67b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// } else { 68b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// LOG(ERROR) << result.status(); 69b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// } 70b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 71b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Example factory implementation returning StatusOr<T*>: 72b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 73b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// StatusOr<Foo*> FooFactory::MakeNewFoo(int arg) { 74b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// if (arg <= 0) { 75b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// return ::util::Status(::util::error::INVALID_ARGUMENT, 76b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// "Arg must be positive"); 77b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// } else { 78b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// return new Foo(arg); 79b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// } 80b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// } 81b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// 82b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 83b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#ifndef GOOGLE_PROTOBUF_STUBS_STATUSOR_H_ 84b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#define GOOGLE_PROTOBUF_STUBS_STATUSOR_H_ 85b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 86b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <new> 87b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <string> 88b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <utility> 89b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 90b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#include <google/protobuf/stubs/status.h> 91b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 92b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace google { 93b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace protobuf { 94b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace util { 95b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 96b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename T> 97b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass StatusOr { 98b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer template<typename U> friend class StatusOr; 99b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 100b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public: 101b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Construct a new StatusOr with Status::UNKNOWN status 102b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StatusOr(); 103b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 104b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Construct a new StatusOr with the given non-ok status. After calling 105b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // this constructor, calls to ValueOrDie() will CHECK-fail. 106b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // 107b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // NOTE: Not explicit - we want to use StatusOr<T> as a return 108b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // value, so it is convenient and sensible to be able to do 'return 109b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Status()' when the return type is StatusOr<T>. 110b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // 111b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // REQUIRES: status != Status::OK. This requirement is DCHECKed. 112b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // In optimized builds, passing Status::OK here will have the effect 113b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // of passing PosixErrorSpace::EINVAL as a fallback. 114b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StatusOr(const Status& status); // NOLINT 115b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 116b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Construct a new StatusOr with the given value. If T is a plain pointer, 117b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // value must not be NULL. After calling this constructor, calls to 118b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // ValueOrDie() will succeed, and calls to status() will return OK. 119b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // 120b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // NOTE: Not explicit - we want to use StatusOr<T> as a return type 121b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // so it is convenient and sensible to be able to do 'return T()' 122b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // when when the return type is StatusOr<T>. 123b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // 124b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // REQUIRES: if T is a plain pointer, value != NULL. This requirement is 125b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // DCHECKed. In optimized builds, passing a NULL pointer here will have 126b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // the effect of passing PosixErrorSpace::EINVAL as a fallback. 127b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StatusOr(const T& value); // NOLINT 128b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 129b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Copy constructor. 130b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StatusOr(const StatusOr& other); 131b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 132b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Conversion copy constructor, T must be copy constructible from U 133b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer template<typename U> 134b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StatusOr(const StatusOr<U>& other); 135b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 136b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Assignment operator. 137b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StatusOr& operator=(const StatusOr& other); 138b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 139b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Conversion assignment operator, T must be assignable from U 140b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer template<typename U> 141b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer StatusOr& operator=(const StatusOr<U>& other); 142b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 143b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Returns a reference to our status. If this contains a T, then 144b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // returns Status::OK. 145b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const Status& status() const; 146b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 147b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Returns this->status().ok() 148b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer bool ok() const; 149b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 150b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Returns a reference to our current value, or CHECK-fails if !this->ok(). 151b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // If you need to initialize a T object from the stored value, 152b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // ConsumeValueOrDie() may be more efficient. 153b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer const T& ValueOrDie() const; 154b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 155b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer private: 156b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer Status status_; 157b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer T value_; 158b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}; 159b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 160b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer//////////////////////////////////////////////////////////////////////////////// 161b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer// Implementation details for StatusOr<T> 162b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 163b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammernamespace internal { 164b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 165b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerclass LIBPROTOBUF_EXPORT StatusOrHelper { 166b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer public: 167b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Move type-agnostic error handling to the .cc. 168b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static void Crash(const util::Status& status); 169b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 170b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // Customized behavior for StatusOr<T> vs. StatusOr<T*> 171b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer template<typename T> 172b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer struct Specialize; 173b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}; 174b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 175b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename T> 176b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstruct StatusOrHelper::Specialize { 177b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer // For non-pointer T, a reference can never be NULL. 178b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static inline bool IsValueNull(const T& t) { return false; } 179b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}; 180b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 181b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename T> 182b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerstruct StatusOrHelper::Specialize<T*> { 183b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer static inline bool IsValueNull(const T* t) { return t == NULL; } 184b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer}; 185b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 186b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace internal 187b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 188b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename T> 189b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline StatusOr<T>::StatusOr() 190b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer : status_(util::Status::UNKNOWN) { 191b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 192b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 193b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename T> 194b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline StatusOr<T>::StatusOr(const Status& status) { 195b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (status.ok()) { 196b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer status_ = Status(error::INTERNAL, "Status::OK is not a valid argument."); 197b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 198b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer status_ = status; 199b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 200b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 201b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 202b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename T> 203b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline StatusOr<T>::StatusOr(const T& value) { 204b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (internal::StatusOrHelper::Specialize<T>::IsValueNull(value)) { 205b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer status_ = Status(error::INTERNAL, "NULL is not a vaild argument."); 206b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } else { 207b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer status_ = Status::OK; 208b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value_ = value; 209b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 210b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 211b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 212b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename T> 213b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline StatusOr<T>::StatusOr(const StatusOr<T>& other) 214b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer : status_(other.status_), value_(other.value_) { 215b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 216b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 217b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename T> 218b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline StatusOr<T>& StatusOr<T>::operator=(const StatusOr<T>& other) { 219b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer status_ = other.status_; 220b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer value_ = other.value_; 221b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return *this; 222b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 223b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 224b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename T> 225b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename U> 226b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline StatusOr<T>::StatusOr(const StatusOr<U>& other) 227b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer : status_(other.status_), value_(other.status_.ok() ? other.value_ : T()) { 228b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 229b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 230b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename T> 231b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename U> 232b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline StatusOr<T>& StatusOr<T>::operator=(const StatusOr<U>& other) { 233b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer status_ = other.status_; 234b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (status_.ok()) value_ = other.value_; 235b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return *this; 236b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 237b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 238b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename T> 239b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline const Status& StatusOr<T>::status() const { 240b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return status_; 241b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 242b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 243b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename T> 244b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline bool StatusOr<T>::ok() const { 245b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return status().ok(); 246b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 247b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 248b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammertemplate<typename T> 249b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammerinline const T& StatusOr<T>::ValueOrDie() const { 250b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer if (!status_.ok()) { 251b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer internal::StatusOrHelper::Crash(status_); 252b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer } 253b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer return value_; 254b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} 255b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace util 256b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace protobuf 257b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer} // namespace google 258b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer 259b0575e93e4c39dec69365b850088a1eb7f82c5b3Tamas Berghammer#endif // GOOGLE_PROTOBUF_STUBS_STATUSOR_H_ 260