Adapted to recent changes of %build_linklib.
[AROS-Contrib.git] / FryingPan / framework / Generic / RWSyncT.h
blobfb253eb8edd08eb52a05aff24dfe80a4c1eb387b
1 /*
2 * Amiga Generic Set - set of libraries and includes to ease sw development for all Amiga platforms
3 * Copyright (C) 2001-2011 Tomasz Wiszkowski Tomasz.Wiszkowski at gmail.com.
4 *
5 * This library is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either
8 * version 2.1 of the License, or (at your option) any later version.
9 *
10 * This library is distributed in the hope that it will be useful,
11 * but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with this library; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
20 #ifndef RWSYNCT_H_
21 #define RWSYNCT_H_
23 #include "RWSync.h"
25 namespace GenNS
27 template <typename T>
28 class RWSyncT
30 T resource;
31 RWSync pSync;
32 public:
34 RWSyncT()
38 virtual ~RWSyncT()
40 pSync.ObtainWrite();
43 virtual T &AttemptRead(bool *bResult)
45 if ((pSync.AttemptRead()) && (0 != bResult))
46 *bResult = true;
47 else if (0 != bResult)
48 *bResult = false;
49 return resource;
52 virtual T &ObtainRead()
54 pSync.ObtainRead();
55 return resource;
58 virtual T &AttemptWrite(bool *bResult)
60 if ((pSync.AttemptWrite()) && (0 != bResult))
61 *bResult = true;
62 else if (0 != bResult)
63 *bResult = false;
64 return resource;
67 virtual T &ObtainWrite()
69 pSync.ObtainWrite();
70 return resource;
73 virtual void Release()
75 pSync.Release();
78 virtual T Assign(T newValue)
80 T oldValue;
81 oldValue = ObtainWrite();
82 resource = newValue;
83 Release();
84 return oldValue;
87 virtual T AttemptAssign(T newValue, bool *bResult)
89 T oldValue;
90 bool bRes;
91 oldValue = AttemptWrite(&bRes);
92 if (bRes)
94 resource = newValue;
95 Release();
96 if (bResult)
97 *bResult = true;
98 return oldValue;
100 if (bResult)
101 *bResult = false;
102 return resource;
105 RWSyncT<T> &operator = (RWSyncT<T> &hOther)
107 pSync.ObtainWrite(); // make sure nobody accesses us atm
109 *resource = *hOther.resource; // copy elements, dont bother how.
111 pSync.Release(); // this is the obtained one :)
112 return *this;
119 #endif /*RWSYNCT_H_*/