Sirikata
libcore/include/sirikata/core/util/SimpleExtrapolator.hpp
Go to the documentation of this file.
00001 /*  Sirikata
00002  *  SimpleExtrapolator.hpp
00003  *
00004  *  Copyright (c) 2010, Ewen Cheslack-Postava
00005  *  All rights reserved.
00006  *
00007  *  Redistribution and use in source and binary forms, with or without
00008  *  modification, are permitted provided that the following conditions are
00009  *  met:
00010  *  * Redistributions of source code must retain the above copyright
00011  *    notice, this list of conditions and the following disclaimer.
00012  *  * Redistributions in binary form must reproduce the above copyright
00013  *    notice, this list of conditions and the following disclaimer in
00014  *    the documentation and/or other materials provided with the
00015  *    distribution.
00016  *  * Neither the name of Sirikata nor the names of its contributors may
00017  *    be used to endorse or promote products derived from this software
00018  *    without specific prior written permission.
00019  *
00020  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
00021  * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
00022  * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
00023  * PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER
00024  * OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
00025  * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
00026  * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
00027  * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
00028  * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
00029  * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
00030  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00031  */
00032 
00033 #ifndef _SIRIKATA_SIMPLE_EXTRAPOLATOR_HPP_
00034 #define _SIRIKATA_SIMPLE_EXTRAPOLATOR_HPP_
00035 
00036 #include "Extrapolation.hpp"
00037 
00038 namespace Sirikata {
00039 
00041 template <typename Value, typename UpdatePredicate, typename TimeType, typename DurationType>
00042 class SimpleExtrapolatorBase : public virtual Sirikata::ExtrapolatorBase<Value, TimeType>, protected UpdatePredicate {
00043 protected:
00044     typedef Sirikata::TemporalValueBase<Value, TimeType> TemporalValueType;
00045     TemporalValueType mValue;
00046 public:
00047     SimpleExtrapolatorBase(const TimeType& t, const Value& actualValue, const UpdatePredicate& needsUpdate)
00048      : Sirikata::ExtrapolatorBase<Value, TimeType>(),
00049        UpdatePredicate(needsUpdate),
00050        mValue(t,actualValue)
00051     {}
00052     SimpleExtrapolatorBase(const TimeType& t, const Value& actualValue)
00053      : Sirikata::ExtrapolatorBase<Value, TimeType>(),
00054        UpdatePredicate(),
00055        mValue(t,actualValue)
00056     {}
00057 
00058     SimpleExtrapolatorBase(const TemporalValueType& tv, const UpdatePredicate& needsUpdate)
00059      : Sirikata::ExtrapolatorBase<Value, TimeType>(),
00060        UpdatePredicate(needsUpdate),
00061        mValue(tv)
00062     {}
00063     SimpleExtrapolatorBase(const TemporalValueType& tv)
00064      : Sirikata::ExtrapolatorBase<Value, TimeType>(),
00065        UpdatePredicate(),
00066        mValue(tv)
00067     {}
00068 
00069     virtual ~SimpleExtrapolatorBase(){}
00070     virtual bool needsUpdate(const TimeType&now,const Value&actualValue) const{
00071         const UpdatePredicate* mNeedsUpdate=this;
00072         return (*mNeedsUpdate)(actualValue, extrapolate(now));
00073     }
00074     Value extrapolate(const TimeType&t) const {
00075         return mValue.extrapolate(t);
00076     }
00077     const Value&lastValue() const{
00078         return mValue.value();
00079     }
00080     TimeType lastUpdateTime()const{
00081         return mValue.time();
00082     }
00083     SimpleExtrapolatorBase& updateValue(const TimeType&t, const Value&l) {
00084         mValue = TemporalValueType(t,l);
00085         return *this;
00086     }
00087     SimpleExtrapolatorBase& resetValue(const TimeType&t, const Value&l) {
00088         mValue = TemporalValueType(t,l);
00089         return *this;
00090     }
00091     bool propertyHolds(const TimeType&when, const std::tr1::function<bool(const Value&)>&f)const{
00092         return f(mValue.extrapolate(when));
00093     }
00094 };
00095 
00096 template <typename Value, typename UpdatePredicate>
00097 class SimpleExtrapolator : public SimpleExtrapolatorBase<Value, UpdatePredicate, Time, Duration>, public Extrapolator<Value> {
00098 private:
00099     typedef typename SimpleExtrapolatorBase<Value, UpdatePredicate, Time, Duration>::TemporalValueType TemporalValueType;
00100 public:
00101     SimpleExtrapolator(const Time& t, const Value& actualValue, const UpdatePredicate& needsUpdate)
00102      : SimpleExtrapolatorBase<Value, UpdatePredicate, Time, Duration>(t, actualValue, needsUpdate)
00103     {}
00104     SimpleExtrapolator(const Time& t, const Value& actualValue)
00105      : SimpleExtrapolatorBase<Value, UpdatePredicate, Time, Duration>(t, actualValue)
00106     {}
00107     SimpleExtrapolator(const TemporalValueType& tv, const UpdatePredicate& needsUpdate)
00108      : SimpleExtrapolatorBase<Value, UpdatePredicate, Time, Duration>(tv, needsUpdate)
00109     {}
00110     SimpleExtrapolator(const TemporalValueType& tv)
00111      : SimpleExtrapolatorBase<Value, UpdatePredicate, Time, Duration>(tv)
00112     {}
00113 };
00114 
00115 }
00116 
00117 #endif //_SIRIKATA_SIMPLE_EXTRAPOLATOR_HPP_