18cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
28cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @file cached_value.h
38cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Hold a cached value.
48cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
58cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Copyright 2005 OProfile authors
68cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @remark Read the file COPYING
78cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd *
88cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * @author John Levon
98cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
108cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
118cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#ifndef CACHED_VALUE_H
128cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#define CACHED_VALUE_H
138cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
148cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#include "op_exception.h"
158cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
168cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd/**
178cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd * Hold a single value, returning a cached value if there is one.
188cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd */
198cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddtemplate <class T>
208cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddclass cached_value
218cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd{
228cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddpublic:
238cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	cached_value() : set(false) {}
248cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
258cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	typedef T value_type;
268cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
278cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return the cached value
288cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	value_type const get() const {
298cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		if (!set)
308cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd			throw op_fatal_error("cached value not set");
318cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return value;
328cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
338cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
348cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// return true if a value is cached
358cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool cached() const { return set; }
368cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
378cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// set the contained value
388cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	value_type const reset(value_type const & val) {
398cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		value = val;
408cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		set = true;
418cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd		return value;
428cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	}
438cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
448cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Doddprivate:
458cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// the cached value
468cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	value_type value;
478cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	/// is the value valid?
488cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd	bool set;
498cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd};
508cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
518cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd
528cfa702f803c5ef6a2b062a489a1b2cf66b45b5eMike Dodd#endif /* !CACHED_VALUE_H */
53