Code

fix 198818
[inkscape.git] / src / util / share.h
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);
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);
111 template <typename T>
112 inline ptr_shared<T> share_unsafe(T const *obj) {
113     return ptr_shared<T>::share_unsafe(obj);
116 inline ptr_shared<char> share_static_string(char const *string) {
117     return share_unsafe(string);
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()));
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()));
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()));
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 :