00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #ifndef SACADO_MPL_RANGE_C_HPP
00033 #define SACADO_MPL_RANCE_C_HPP
00034
00035 #include "Sacado_mpl_none.hpp"
00036 #include "Sacado_mpl_size.hpp"
00037 #include "Sacado_mpl_begin.hpp"
00038 #include "Sacado_mpl_end.hpp"
00039 #include "Sacado_mpl_next.hpp"
00040 #include "Sacado_mpl_at.hpp"
00041 #include "Sacado_mpl_deref.hpp"
00042 #include "Sacado_mpl_integral_c.hpp"
00043
00044 namespace Sacado {
00045
00046 namespace mpl {
00047
00048
00049 struct range_c_tag {};
00050
00051
00052 template <class T, T N, T M>
00053 struct range_c {
00054 typedef range_c_tag tag;
00055 typedef range_c type;
00056 static const int sz = M-N;
00057 typedef T integral_type;
00058 static const int start_value = N;
00059 static const int end_value = M;
00060 };
00061
00062
00063 template <class Range, int Pos>
00064 struct range_c_iterator {
00065 static const int value = Pos;
00066 };
00067
00068
00069 template <>
00070 struct size_impl<range_c_tag> {
00071 template <class Range>
00072 struct apply {
00073 static const int value = Range::sz;
00074 };
00075 };
00076
00077
00078 template <>
00079 struct begin_impl<range_c_tag> {
00080 template <class Range>
00081 struct apply {
00082 typedef range_c_iterator<Range,0> type;
00083 };
00084 };
00085
00086
00087 template <>
00088 struct end_impl<range_c_tag> {
00089 template <class Range>
00090 struct apply {
00091 typedef range_c_iterator<Range,Range::sz> type;
00092 };
00093 };
00094
00095
00096 template <class Range, int Pos>
00097 struct next< range_c_iterator<Range,Pos> > {
00098 typedef range_c_iterator<Range,Pos+1> type;
00099 };
00100
00101
00102
00103
00104 template <int Pos>
00105 struct at_impl<range_c_tag, Pos> {
00106 template <class Range>
00107 struct apply {
00108 typedef integral_c<typename Range::integral_type, Range::start_value+Pos> type;
00109 };
00110 };
00111
00112
00113 template <class Range, int Pos>
00114 struct deref< range_c_iterator<Range,Pos> > : mpl::at<Range,Pos> {};
00115
00116 }
00117 }
00118
00119 #endif