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