1 /*
2 * Inkscape::Util::ptr_shared<T> - like T const *, but stronger
3 *
4 * Authors:
5 * MenTaLguY <mental@rydia.net>
6 *
7 * Copyright (C) 2006 MenTaLguY
8 *
9 * Released under GNU GPL, read the file 'COPYING' for more information
10 */
12 #ifndef SEEN_INKSCAPE_UTIL_SHARE_H
13 #define SEEN_INKSCAPE_UTIL_SHARE_H
15 #include "gc-core.h"
16 #include <cstring>
18 namespace Inkscape {
19 namespace Util {
21 template <typename T>
22 class ptr_shared {
23 public:
24 ptr_shared() : _obj(NULL) {}
26 template <typename T1>
27 ptr_shared(ptr_shared<T1> const &other) : _obj(other._obj) {}
29 T const *pointer() const { return _obj; }
31 template <typename T1>
32 operator T1 const *() const { return _obj; }
34 operator bool() const { return _obj; }
36 T const &operator*() const { return *_obj; }
37 T const *operator->() const { return _obj; }
38 T const &operator[](int i) const { return _obj[i]; }
40 ptr_shared<T> operator+(int i) const {
41 return share_unsafe(_obj+i);
42 }
43 ptr_shared<T> operator-(int i) const {
44 return share_unsafe(_obj-i);
45 }
47 ptr_shared<T> &operator+=(int i) const {
48 _obj += i;
49 return *this;
50 }
51 ptr_shared<T> &operator-=(int i) const {
52 _obj -= i;
53 return *this;
54 }
56 template <typename T1>
57 std::ptrdiff_t operator-(ptr_shared<T1> const &other) {
58 return _obj - other._obj;
59 }
61 template <typename T1>
62 ptr_shared<T> &operator=(ptr_shared<T1> const &other) {
63 _obj = other._obj;
64 return *this;
65 }
67 template <typename T1>
68 bool operator==(ptr_shared<T1> const &other) const {
69 return _obj == other._obj;
70 }
72 template <typename T1>
73 bool operator!=(ptr_shared<T1> const &other) const {
74 return _obj != other._obj;
75 }
77 template <typename T1>
78 bool operator>(ptr_shared<T1> const &other) const {
79 return _obj > other._obj;
80 }
82 template <typename T1>
83 bool operator<(ptr_shared<T1> const &other) const {
84 return _obj < other._obj;
85 }
87 static ptr_shared<T> share_unsafe(T const *obj) {
88 return ptr_shared<T>(obj);
89 }
91 protected:
92 explicit ptr_shared(T const *obj) : _obj(obj) {}
94 private:
95 T const *_obj;
96 };
98 template <typename T>
99 inline ptr_shared<T> share(T const *obj) {
100 return share_unsafe(obj ? new T(*obj) : NULL);
101 }
103 ptr_shared<char> share_string(char const *string);
104 ptr_shared<char> share_string(char const *string, std::size_t length);
106 template <typename T>
107 inline ptr_shared<T> reshare(T const *obj) {
108 return ptr_shared<T>::share_unsafe(obj);
109 }
111 template <typename T>
112 inline ptr_shared<T> share_unsafe(T const *obj) {
113 return ptr_shared<T>::share_unsafe(obj);
114 }
116 inline ptr_shared<char> share_static_string(char const *string) {
117 return share_unsafe(string);
118 }
120 template <typename T1, typename T2>
121 inline ptr_shared<T1> static_cast_shared(ptr_shared<T2> const &ref) {
122 return reshare(static_cast<T1 const *>(ref.pointer()));
123 }
125 template <typename T1, typename T2>
126 inline ptr_shared<T1> dynamic_cast_shared(ptr_shared<T2> const &ref) {
127 return reshare(dynamic_cast<T1 const *>(ref.pointer()));
128 }
130 template <typename T1, typename T2>
131 inline ptr_shared<T1> reinterpret_cast_shared(ptr_shared<T2> const &ref) {
132 return reshare(reinterpret_cast<T1 const *>(ref.pointer()));
133 }
135 }
136 }
138 #endif
139 /*
140 Local Variables:
141 mode:c++
142 c-file-style:"stroustrup"
143 c-file-offsets:((innamespace . 0)(inline-open . 0)(case-label . +))
144 indent-tabs-mode:nil
145 fill-column:99
146 End:
147 */
148 // vim: filetype=cpp:expandtab:shiftwidth=4:tabstop=8:softtabstop=4:encoding=utf-8:textwidth=99 :