70 lines
1.4 KiB
C++
70 lines
1.4 KiB
C++
|
|
/*
|
|||
|
|
* ShadowGuard.h
|
|||
|
|
*
|
|||
|
|
* Created on: 10 <EFBFBD><EFBFBD><EFBFBD> 2017 <EFBFBD>.
|
|||
|
|
* Author: titov
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
#ifndef SOURCES_COMMON_SHADOWGUARD_H_
|
|||
|
|
#define SOURCES_COMMON_SHADOWGUARD_H_
|
|||
|
|
|
|||
|
|
//!<21><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
/*!<21><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> update <20><> <20><><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> operator =.
|
|||
|
|
*
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
template<typename V>
|
|||
|
|
class ShadowGuard : public V {
|
|||
|
|
private:
|
|||
|
|
V shadow_value;
|
|||
|
|
bool upd;
|
|||
|
|
|
|||
|
|
public:
|
|||
|
|
ShadowGuard(const V &);
|
|||
|
|
|
|||
|
|
//!<21><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
void operator=(const V & new_value);
|
|||
|
|
|
|||
|
|
//!<21><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.
|
|||
|
|
void update();
|
|||
|
|
};
|
|||
|
|
|
|||
|
|
template<typename V>
|
|||
|
|
inline void ShadowGuard<V>::operator =(const V & new_value) {
|
|||
|
|
upd = false; shadow_value = new_value; upd = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
template<typename V>
|
|||
|
|
inline ShadowGuard<V>::ShadowGuard(const V & rv) :
|
|||
|
|
V(rv), shadow_value(rv), upd(false) {}
|
|||
|
|
|
|||
|
|
template<typename V>
|
|||
|
|
inline void ShadowGuard<V>::update() {
|
|||
|
|
if(upd) {
|
|||
|
|
|
|||
|
|
volatile V new_value = shadow_value;
|
|||
|
|
|
|||
|
|
// do {
|
|||
|
|
// new_value = shadow_value;
|
|||
|
|
// } while( new_value != shadow_value );
|
|||
|
|
|
|||
|
|
*static_cast<V *>(this) = shadow_value;
|
|||
|
|
upd = false;
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
template<typename V>
|
|||
|
|
V read_from_fast( volatile const V * value ) {
|
|||
|
|
|
|||
|
|
V * fast_value = const_cast<V *>(value);
|
|||
|
|
V temp(*fast_value);
|
|||
|
|
|
|||
|
|
do {
|
|||
|
|
temp = *fast_value;
|
|||
|
|
} while( temp != *fast_value );
|
|||
|
|
|
|||
|
|
return temp;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
#endif /* SOURCES_COMMON_SHADOWGUARD_H_ */
|