rsObjectBase.h revision e514b45de8561fbc6ef6770845102ca10b0a69d7
1/*
2 * Copyright (C) 2009 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17#ifndef ANDROID_RS_OBJECT_BASE_H
18#define ANDROID_RS_OBJECT_BASE_H
19
20#include "rsUtils.h"
21
22
23namespace android {
24namespace renderscript {
25
26class Context;
27
28// An element is a group of Components that occupies one cell in a structure.
29class ObjectBase
30{
31public:
32    ObjectBase(Context *rsc);
33    virtual ~ObjectBase();
34
35    void incSysRef() const;
36    bool decSysRef() const;
37
38    void incUserRef() const;
39    bool decUserRef() const;
40    bool zeroUserRef() const;
41
42    const char * getName() const {
43        return mName;
44    }
45    void setName(const char *);
46    void setName(const char *, uint32_t len);
47
48    Context * getContext() const {return mRSC;}
49    void setContext(Context *);
50
51    static void zeroAllUserRef(Context *rsc);
52
53private:
54    void add() const;
55    void remove() const;
56
57    bool checkDelete() const;
58
59    char * mName;
60    Context *mRSC;
61    mutable int32_t mSysRefCount;
62    mutable int32_t mUserRefCount;
63
64    mutable const ObjectBase * mPrev;
65    mutable const ObjectBase * mNext;
66};
67
68template<class T>
69class ObjectBaseRef
70{
71public:
72    ObjectBaseRef() {
73        mRef = NULL;
74    }
75
76    ObjectBaseRef(const ObjectBaseRef &ref) {
77        mRef = ref.get();
78        if (mRef) {
79            mRef->incSysRef();
80        }
81    }
82
83    ObjectBaseRef(T *ref) {
84        mRef = ref;
85        if (mRef) {
86            ref->incSysRef();
87        }
88    }
89
90    ~ObjectBaseRef() {
91        clear();
92    }
93
94    void set(T *ref) {
95        if (mRef != ref) {
96            clear();
97            mRef = ref;
98            if (mRef) {
99                ref->incSysRef();
100            }
101        }
102    }
103
104    void set(const ObjectBaseRef &ref) {
105        set(ref.mRef);
106    }
107
108    void clear() {
109        if (mRef) {
110            mRef->decSysRef();
111        }
112        mRef = NULL;
113    }
114
115    inline T * get() const {
116        return mRef;
117    }
118
119    inline T * operator-> () const {
120        return mRef;
121    }
122
123protected:
124    T * mRef;
125
126};
127
128
129}
130}
131
132#endif //ANDROID_RS_OBJECT_BASE_H
133
134