]> CyberLeo.Net >> Repos - FreeBSD/releng/10.0.git/blob - contrib/llvm/tools/lldb/include/lldb/Utility/PythonPointer.h
- Copy stable/10 (r259064) to releng/10.0 as part of the
[FreeBSD/releng/10.0.git] / contrib / llvm / tools / lldb / include / lldb / Utility / PythonPointer.h
1 //===---------------------PythonPointer.h ------------------------*- C++ -*-===//
2 //
3 //                     The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9
10 #ifndef utility_PythonPointer_h_
11 #define utility_PythonPointer_h_
12
13 #include <algorithm>
14
15 #if defined (__APPLE__)
16 #include <Python/Python.h>
17 #else
18 #include <Python.h>
19 #endif
20
21 namespace lldb_private {
22
23 template<class T>
24 class PythonPointer
25 {
26 public: 
27     typedef PyObject* element_type; 
28 private:
29     element_type*      ptr_;
30     bool my_ref;
31 public:
32     
33     PythonPointer(element_type p, bool steal_ref = false) :
34     ptr_(p),
35     my_ref(!steal_ref)
36     {
37         if (my_ref)
38             Py_INCREF(ptr_);
39     }
40     
41     PythonPointer(const PythonPointer& r, bool steal_ref = false) :
42     ptr_(r.ptr_),
43     my_ref(!steal_ref)
44     {
45         if (my_ref)
46             Py_INCREF(ptr_);
47     }
48
49     ~PythonPointer()
50     {
51         if (my_ref)
52             Py_XDECREF(ptr_);
53     }
54     
55     PythonPointer
56     StealReference()
57     {
58         return PythonPointer(ptr_,true);
59     }
60     
61     PythonPointer
62     DuplicateReference()
63     {
64         return PythonPointer(ptr_, false);
65     }
66
67     element_type get() const {return ptr_;}
68     
69     bool IsNull() { return ptr_ == NULL; }
70     bool IsNone() { return ptr_ == Py_None; }
71     
72     operator PyObject* () { return ptr_; }
73 };
74
75 } // namespace lldb
76
77 #endif  // utility_PythonPointer_h_