github.com/cellofellow/gopkg@v0.0.0-20140722061823-eec0544a62ad/database/leveldb.chai2010/include/leveldb/status.h (about)

     1  // Copyright (c) 2011 The LevelDB Authors. All rights reserved.
     2  // Use of this source code is governed by a BSD-style license that can be
     3  // found in the LICENSE file. See the AUTHORS file for names of contributors.
     4  //
     5  // A Status encapsulates the result of an operation.  It may indicate success,
     6  // or it may indicate an error with an associated error message.
     7  //
     8  // Multiple threads can invoke const methods on a Status without
     9  // external synchronization, but if any of the threads may call a
    10  // non-const method, all threads accessing the same Status must use
    11  // external synchronization.
    12  
    13  #ifndef STORAGE_LEVELDB_INCLUDE_STATUS_H_
    14  #define STORAGE_LEVELDB_INCLUDE_STATUS_H_
    15  
    16  #include <string>
    17  #include "leveldb/slice.h"
    18  
    19  namespace leveldb {
    20  
    21  class Status {
    22   public:
    23    // Create a success status.
    24    Status() : state_(NULL) { }
    25    ~Status() { delete[] state_; }
    26  
    27    // Copy the specified status.
    28    Status(const Status& s);
    29    void operator=(const Status& s);
    30  
    31    // Return a success status.
    32    static Status OK() { return Status(); }
    33  
    34    // Return error status of an appropriate type.
    35    static Status NotFound(const Slice& msg, const Slice& msg2 = Slice()) {
    36      return Status(kNotFound, msg, msg2);
    37    }
    38    static Status Corruption(const Slice& msg, const Slice& msg2 = Slice()) {
    39      return Status(kCorruption, msg, msg2);
    40    }
    41    static Status NotSupported(const Slice& msg, const Slice& msg2 = Slice()) {
    42      return Status(kNotSupported, msg, msg2);
    43    }
    44    static Status InvalidArgument(const Slice& msg, const Slice& msg2 = Slice()) {
    45      return Status(kInvalidArgument, msg, msg2);
    46    }
    47    static Status IOError(const Slice& msg, const Slice& msg2 = Slice()) {
    48      return Status(kIOError, msg, msg2);
    49    }
    50  
    51    // Returns true iff the status indicates success.
    52    bool ok() const { return (state_ == NULL); }
    53  
    54    // Returns true iff the status indicates a NotFound error.
    55    bool IsNotFound() const { return code() == kNotFound; }
    56  
    57    // Returns true iff the status indicates a Corruption error.
    58    bool IsCorruption() const { return code() == kCorruption; }
    59  
    60    // Returns true iff the status indicates an IOError.
    61    bool IsIOError() const { return code() == kIOError; }
    62  
    63    // Return a string representation of this status suitable for printing.
    64    // Returns the string "OK" for success.
    65    std::string ToString() const;
    66  
    67   private:
    68    // OK status has a NULL state_.  Otherwise, state_ is a new[] array
    69    // of the following form:
    70    //    state_[0..3] == length of message
    71    //    state_[4]    == code
    72    //    state_[5..]  == message
    73    const char* state_;
    74  
    75    enum Code {
    76      kOk = 0,
    77      kNotFound = 1,
    78      kCorruption = 2,
    79      kNotSupported = 3,
    80      kInvalidArgument = 4,
    81      kIOError = 5
    82    };
    83  
    84    Code code() const {
    85      return (state_ == NULL) ? kOk : static_cast<Code>(state_[4]);
    86    }
    87  
    88    Status(Code code, const Slice& msg, const Slice& msg2);
    89    static const char* CopyState(const char* s);
    90  };
    91  
    92  inline Status::Status(const Status& s) {
    93    state_ = (s.state_ == NULL) ? NULL : CopyState(s.state_);
    94  }
    95  inline void Status::operator=(const Status& s) {
    96    // The following condition catches both aliasing (when this == &s),
    97    // and the common case where both s and *this are ok.
    98    if (state_ != s.state_) {
    99      delete[] state_;
   100      state_ = (s.state_ == NULL) ? NULL : CopyState(s.state_);
   101    }
   102  }
   103  
   104  }  // namespace leveldb
   105  
   106  #endif  // STORAGE_LEVELDB_INCLUDE_STATUS_H_