libbio
Loading...
Searching...
No Matches
CowRefCount.h
Go to the documentation of this file.
1/*
2 * This file is a part of the Biology project by eons LLC.
3 * Biology (aka Develop Biology) is a framework for approaching software
4 * development from a natural sciences perspective.
5 *
6 * Copyright (C) 2026 Séon O'Shannon & eons LLC
7 *
8 * This program is free software: you can redistribute it and/or modify
9 * it under the terms of the GNU Affero General Public License as
10 * published by the Free Software Foundation, either version 3 of the
11 * License, or (at your option) any later version.
12 *
13 * This program is distributed in the hope that it will be useful,
14 * but WITHOUT ANY WARRANTY; without even the implied warranty of
15 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
16 * GNU Affero General Public License for more details.
17 *
18 * You should have received a copy of the GNU Affero General Public License
19 * along with this program. If not, see <https://www.gnu.org/licenses/>.
20 */
21
22#pragma once
23
25
26#if BIO_CPP_VERSION >= 11
27 #include <atomic>
28#endif
29
53namespace bio {
54
55#if BIO_CPP_VERSION >= 11
56
57typedef ::std::atomic< unsigned int > CowRefCount;
58
64inline void CowInc(CowRefCount& count)
65{
66 count.fetch_add(1, ::std::memory_order_relaxed);
67}
68
74inline bool CowDecAndIsLast(CowRefCount& count)
75{
76 return count.fetch_sub(1, ::std::memory_order_acq_rel) == 1;
77}
78
84inline unsigned int CowLoad(const CowRefCount& count)
85{
86 return count.load(::std::memory_order_relaxed);
87}
88
89#else // cpp98: plain counter, caller-serialised (no __sync_* in-tree)
90
91typedef unsigned int CowRefCount;
92
94{
95 ++count;
96}
97
99{
100 return (--count == 0);
101}
102
103inline unsigned int CowLoad(const CowRefCount& count)
104{
105 return count;
106}
107
108#endif
109
110} // namespace bio
Definition Pointer.h:115
Definition FinalCell.h:29
bool CowDecAndIsLast(CowRefCount &count)
Definition CowRefCount.h:98
unsigned int CowLoad(const CowRefCount &count)
Definition CowRefCount.h:103
void CowInc(CowRefCount &count)
Definition CowRefCount.h:93
unsigned int CowRefCount
Definition CowRefCount.h:91