The Pedigree Project 0.1
PointerGuard.h
1/*
2 * Copyright (c) 2008-2014, Pedigree Developers
3 *
4 * Please see the CONTRIB file in the root of the source tree for a full
5 * list of contributors.
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20#ifndef POINTERGUARD_H
21#define POINTERGUARD_H
22
23#include "pedigree/kernel/Log.h"
24#include "pedigree/kernel/processor/types.h"
25
29template <class T>
31 public:
32 PointerGuard(T* p = 0, bool bArray = false) : m_Pointer(p), m_Wrapper(0), m_Array(bArray) {
33 // NOTICE("PointerGuard: Guarding pointer [" <<
34 // reinterpret_cast<uintptr_t>(m_Pointer) << "]");
35 }
36
37 PointerGuard(T** p = 0, bool bArray = false) : m_Pointer(*p), m_Wrapper(p), m_Array(bArray) {
38 // NOTICE("PointerGuard: Guarding pointer [" <<
39 // reinterpret_cast<uintptr_t>(m_Pointer) << "]");
40 }
41
42 virtual ~PointerGuard() {
43 // NOTICE("PointerGuard: Out-of-scope, deleting guarded pointer [" <<
44 // reinterpret_cast<uintptr_t>(m_Pointer) << "]");
45 if (m_Pointer) {
46 if (m_Array)
47 delete[] m_Pointer;
48 else
49 delete m_Pointer;
50 m_Pointer = 0;
51 }
52
53 if (m_Wrapper) {
54 *m_Wrapper = 0;
55 }
56 }
57
63 ERROR("PointerGuard: copy constructor called");
64 m_Pointer = 0;
65 m_Wrapper = 0;
66 }
67
68 PointerGuard<T>& operator=(PointerGuard<T>& p) {
69 ERROR("PointerGuard: operator = called");
70 m_Pointer = 0;
71 m_Wrapper = 0;
72 }
73
74 private:
75 T* m_Pointer;
76 T** m_Wrapper;
77 bool m_Array;
78};
79
80#endif
PointerGuard(PointerGuard< T > &p)