[array] range check (at compile time)
Hi, Lately I find myself using boost::array intesively, specially in small demo programs. Sometimes, when "manually" accessing the elements I type a index out of range. The library can detect these errors once the program is running but I found this a waste, also I was surprised not to see this kind of static check not implemented in the library. So I wanted to see if I could enforce range checking at compile time, and I come out with this solution. namespace boost{ //sorry about the namespace name template<size_t IDX, typename T, size_t N> const T& get(boost::array<T, N> const& arr){ BOOST_STATIC_ASSERT(IDX<N); return arr[IDX]; } template<size_t IDX, typename T, size_t N> T& get(boost::array<T, N>& arr){ BOOST_STATIC_ASSERT(IDX<N); return arr[IDX]; } } #include<iostream> void main(){ boost::array<double, 3> a = {1,2,3}; std::clog<<boost::get<2>(a)<<std::endl; // ok, (namespace specification needed, why?) std::clog<<boost::get<5>(a)<<std::endl; //does not compile return 0; } (I though about using enable_if instead of BOOST_STATIC_ASSERT but that would be too much overengineering.) Is this implemented already in some other way? Alfredo
On 19 February 2010 23:35, alfC <alfredo.correa@gmail.com> wrote:
std::clog<<boost::get<2>(a)<<std::endl;
Is this implemented already in some other way?
Well, it's in the n3000 C++0x draft (23.3.1.7 array.tuple), so it ought to be made available even if there is currently another way.
On 2/20/2010 12:42 PM, Scott McMurray wrote:
On 19 February 2010 23:35, alfC<alfredo.correa@gmail.com> wrote:
std::clog<<boost::get<2>(a)<<std::endl;
Is this implemented already in some other way?
Well, it's in the n3000 C++0x draft (23.3.1.7 array.tuple), so it ought to be made available even if there is currently another way.
FYI, Fusion adapts boost array as a fully conforming sequence. So: fusion::at_c<2>(a) is perfectly valid. Regards, -- Joel de Guzman http://www.boostpro.com http://spirit.sf.net http://www.facebook.com/djowel Meet me at BoostCon http://www.boostcon.com/home http://www.facebook.com/boostcon
FYI,Fusionadaptsboostarrayas a fully conforming sequence. So:
fusion::at_c<2>(a)
is perfectly valid.
this syntax in this minimal example works (runs) but the error is still at runtime #include<iostream> #include <boost/fusion/sequence.hpp> #include</usr/include/boost/fusion/adapted/array.hpp> int main(){ boost::array<double, 2> a; std::cout <<boost::fusion::at_c<0>(a)<<' ' //ok <<boost::fusion::at_c<1>(a)<<' ' //ok <<boost::fusion::at_c<2>(a)<<std::endl; //gives error but at runtime (boost/array.hpp runtime assertion) return 0; }
On Fri, Mar 5, 2010 at 11:37 AM, alfC <alfredo.correa@gmail.com> wrote:
FYI,Fusionadaptsboostarrayas a fully conforming sequence. So:
fusion::at_c<2>(a)
is perfectly valid.
this syntax in this minimal example works (runs) but the error is still at runtime
#include<iostream> #include <boost/fusion/sequence.hpp> #include</usr/include/boost/fusion/adapted/array.hpp> int main(){ boost::array<double, 2> a; std::cout <<boost::fusion::at_c<0>(a)<<' ' //ok <<boost::fusion::at_c<1>(a)<<' ' //ok <<boost::fusion::at_c<2>(a)<<std::endl; //gives error but at runtime (boost/array.hpp runtime assertion) return 0; }
Hmm, shouldn't the adaptor for boost::array use the template parameter of boost::array to define its extant?
On Fri, Mar 5, 2010 at 7:30 PM, OvermindDL1 <overminddl1@gmail.com> wrote:
On Fri, Mar 5, 2010 at 11:37 AM, alfC <alfredo.correa@gmail.com> wrote:
FYI,Fusionadaptsboostarrayas a fully conforming sequence. So:
fusion::at_c<2>(a)
is perfectly valid.
this syntax in this minimal example works (runs) but the error is still at runtime
#include<iostream> #include <boost/fusion/sequence.hpp> #include</usr/include/boost/fusion/adapted/array.hpp> int main(){ boost::array<double, 2> a; std::cout <<boost::fusion::at_c<0>(a)<<' ' //ok <<boost::fusion::at_c<1>(a)<<' ' //ok <<boost::fusion::at_c<2>(a)<<std::endl; //gives error but at runtime (boost/array.hpp runtime assertion) return 0; }
Hmm, shouldn't the adaptor for boost::array use the template parameter of boost::array to define its extant?
/extant/extent Helps if I can spell...
alfC wrote:
Hmm, shouldn't the adaptor for boost::array use the template parameter of boost::array to define its extant?
a small example on how to create such adaptor to boost::array will be greatly appreciated.
thanks, Alfredo
Basically, if i am not mistaken on your intent, you need to change the behavior of fusion::at_impl for array so it fires a static assert if the index is greater than the array extent: template<> struct at_impl<array_tag> { template<typename Sequence, typename N> struct apply { typedef typename mpl::if_ < is_const<Sequence> , typename Sequence::const_reference , typename Sequence::reference>::type type; static type call(Sequence& seq) { BOOST_STATIC_ASSERT(N < Sequence::static_size); return seq[N::value]; } }; };
Same request, see: 'question: boost::array does not have compile time checked access' (http://lists.boost.org/boost-users/2005/08/12983.php)
participants (6)
-
alfC
-
gast128
-
Joel de Guzman
-
Joel Falcou
-
OvermindDL1
-
Scott McMurray