summaryrefslogtreecommitdiff
path: root/bindings/cpp/upb/upb.hpp
blob: 48c2708e8d2ddeca4f2ef09eac738a70b7d0cbc5 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
//
// upb - a minimalist implementation of protocol buffers.
//
// Copyright (c) 2011 Google Inc.  See LICENSE for details.
// Author: Josh Haberman <jhaberman@gmail.com>

#ifndef UPB_HPP
#define UPB_HPP

#include "upb/upb.h"
#include <iostream>

#if defined(__GXX_EXPERIMENTAL_CXX0X__) && !defined(UPB_NO_CXX11)
#define UPB_DISALLOW_CONSTRUCT_AND_DESTRUCT(class_name) \
  class_name() = delete; \
  ~class_name() = delete;
#else
#define UPB_DISALLOW_CONSTRUCT_AND_DESTRUCT(class_name) \
  class_name(); \
  ~class_name();
#endif

namespace upb {

typedef upb_success_t Success;

class Status : public upb_status {
 public:
  Status() { upb_status_init(this); }
  ~Status() { upb_status_uninit(this); }

  bool ok() const { return upb_ok(this); }
  bool eof() const { return upb_eof(this); }

  const char *GetString() const { return upb_status_getstr(this); }
  void SetEof() { upb_status_seteof(this); }
  void SetErrorLiteral(const char* msg) {
    upb_status_seterrliteral(this, msg);
  }

  void Clear() { upb_status_clear(this); }
};

typedef upb_value Value;

template <typename T> T GetValue(Value v);
template <typename T> Value MakeValue(T v);

#define UPB_VALUE_ACCESSORS(type, ctype) \
  template <> inline ctype GetValue<ctype>(Value v) { \
    return upb_value_get ## type(v); \
  } \
  template <> inline Value MakeValue<ctype>(ctype v) { \
    return upb_value_ ## type(v); \
  }

UPB_VALUE_ACCESSORS(double, double);
UPB_VALUE_ACCESSORS(float,  float);
UPB_VALUE_ACCESSORS(int32,  int32_t);
UPB_VALUE_ACCESSORS(int64,  int64_t);
UPB_VALUE_ACCESSORS(uint32, uint32_t);
UPB_VALUE_ACCESSORS(uint64, uint64_t);
UPB_VALUE_ACCESSORS(bool,   bool);

#undef UPB_VALUE_ACCESSORS

template <typename T> inline T* GetPtrValue(Value v) {
  return static_cast<T*>(upb_value_getptr(v));
}
template <typename T> inline Value MakePtrValue(T* v) {
  return upb_value_ptr(static_cast<void*>(v));
}

INLINE std::ostream& operator<<(std::ostream& out, const Status& status) {
  out << status.GetString();
  return out;
}

}  // namespace upb

#endif
generated by cgit on debian on lair
contact matthew@masot.net with questions or feedback