File: VirtualDeleteOperator.cc

package info (click to toggle)
squid 7.2-2
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 33,440 kB
  • sloc: cpp: 184,513; ansic: 12,442; sh: 5,688; makefile: 5,247; perl: 2,560; sql: 326; python: 240; awk: 141; sed: 1
file content (118 lines) | stat: -rw-r--r-- 2,770 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
/*
 * Copyright (C) 1996-2025 The Squid Software Foundation and contributors
 *
 * Squid software is distributed under GPLv2+ license and includes
 * contributions from numerous individuals and organizations.
 * Please see the COPYING and CONTRIBUTORS files for details.
 */

#include "squid.h"

#include <iostream>

class CallCounter
{
public:
    CallCounter();
    void recordNew();
    void recordDelete();
    size_t news() const;
    size_t deletes() const;
private:
    size_t _news, _deletes;
};

CallCounter::CallCounter() : _news(0), _deletes(0) {}

void CallCounter::recordNew() { ++_news;}
void CallCounter::recordDelete() { ++_deletes;}
size_t CallCounter::news() const {return _news;}
size_t CallCounter::deletes() const {return _deletes;}

class BaseVirtual
{
public:
    void *operator new (size_t);
    void operator delete (void *);
    virtual ~BaseVirtual();
    static void DeleteABase(BaseVirtual *aBase);
    static CallCounter Calls;
};

CallCounter BaseVirtual::Calls;

void *
BaseVirtual::operator new(size_t byteCount)
{
    Calls.recordNew();
    return ::operator new (byteCount);
}

void
BaseVirtual::operator delete(void *address)
{
    Calls.recordDelete();
    ::operator delete (address);
}

void
BaseVirtual::DeleteABase(BaseVirtual *aBase)
{
    delete aBase;
}

BaseVirtual::~BaseVirtual() {}

class ChildVirtual : public BaseVirtual
{
public:
    void *operator new (size_t);
    void operator delete (void *);
    ~ChildVirtual() override;
    static CallCounter Calls;
};

CallCounter ChildVirtual::Calls;

void *
ChildVirtual::operator new(size_t byteCount)
{
    Calls.recordNew();
    return ::operator new (byteCount);
}

void
ChildVirtual::operator delete(void *address)
{
    Calls.recordDelete();
    ::operator delete (address);
}

ChildVirtual::~ChildVirtual() {}

int
main(int, char *[])
{
    assert (BaseVirtual::Calls.news() == 0);
    assert (BaseVirtual::Calls.deletes() == 0);
    assert (ChildVirtual::Calls.news() == 0);
    assert (ChildVirtual::Calls.deletes() == 0);
    BaseVirtual *aBase = new ChildVirtual;
    assert (BaseVirtual::Calls.news() == 0);
    assert (BaseVirtual::Calls.deletes() == 0);
    assert (ChildVirtual::Calls.news() == 1);
    assert (ChildVirtual::Calls.deletes() == 0);
    BaseVirtual::DeleteABase(aBase);
    assert (BaseVirtual::Calls.news() == 0);
    assert (BaseVirtual::Calls.deletes() == 0);
    assert (ChildVirtual::Calls.news() == 1);
    assert (ChildVirtual::Calls.deletes() == 1);
    // deleting nullptr works.
    BaseVirtual::DeleteABase(nullptr);
    assert (BaseVirtual::Calls.news() == 0);
    assert (BaseVirtual::Calls.deletes() == 0);
    assert (ChildVirtual::Calls.news() == 1);
    assert (ChildVirtual::Calls.deletes() == 1);
    return EXIT_SUCCESS;
}