Add Google's LevelDB support
[novacoin.git] / src / leveldb / include / leveldb / status.h
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_