00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017 #ifndef __INNERMOST_HH
00018 # define __INNERMOST_HH
00019
00020 # include "bottomup.hh"
00021 # include "../generic/try.hh"
00022 # include "../strategies.hh"
00023
00024 namespace aurelia {
00025
00026 template <typename S>
00027 struct innermost_strategy;
00028
00029 template <typename S>
00030 innermost_strategy<S> innermost(const S& s);
00031
00034 template <typename S>
00035 struct innermost_strategy {
00036 private: S s;
00037 public: innermost_strategy(const S& s): s(s) {}
00038 template <typename T>
00039 T operator()(const T& term) const {
00040 return (bottomup(try_(s < innermost(s))))(term);
00041 }
00042 };
00043
00047 template <typename S>
00048 innermost_strategy<S> innermost(const S& s) {
00049 return innermost_strategy<S>(s);
00050 }
00051
00052 }
00053
00054 #endif