00001
00002
00003 #ifndef _CARRAY2D_H
00004 #define _CARRAY2D_H
00005 #include <algorithm>
00006 #include <cstddef>
00007 #include <cassert>
00008
00009 namespace osl
00010 {
00011 namespace misc
00012 {
00013 template <typename T, size_t Capacity2>
00014 struct CArray2dProxy
00015 {
00016 T* a;
00017 explicit CArray2dProxy(T *ia) : a(ia)
00018 {
00019 }
00020 T& operator[](size_t j) const
00021 {
00022 assert(j < Capacity2);
00023 return a[j];
00024 }
00025 };
00026
00034 template <typename T, size_t Capacity1, size_t Capacity2>
00035 class CArray2d
00036 {
00037 public:
00039 T elements[Capacity1][Capacity2];
00040 public:
00041 typedef CArray2d<T,Capacity1,Capacity2> array_t;
00042 typedef CArray2dProxy<T,Capacity2> proxy_t;
00043 typedef CArray2dProxy<const T,Capacity2> const_proxy_t;
00044
00045 const proxy_t operator[] (size_t i)
00046 {
00047 assert(i < Capacity1);
00048 return proxy_t(elements[i]);
00049 }
00050 T& operator()(size_t i, size_t j)
00051 {
00052 assert(i < Capacity1);
00053 assert(j < Capacity2);
00054 return elements[i][j];
00055 }
00056
00057 const const_proxy_t operator[] (size_t i) const
00058 {
00059 assert(i < Capacity1);
00060 return const_proxy_t(elements[i]);
00061 }
00062
00063 void fill(T value=T()){
00064 for (size_t j=0; j<Capacity1; j++)
00065 std::fill(&elements[j][0], &elements[j][Capacity2], value);
00066 }
00067 const T& operator()(size_t i, size_t j) const
00068 {
00069 assert(i < Capacity1);
00070 assert(j < Capacity2);
00071 return elements[i][j];
00072 }
00073
00074 static size_t capacity1() { return Capacity1; }
00075 static size_t capacity2() { return Capacity2; }
00076 static size_t size1() { return Capacity1; }
00077 static size_t size2() { return Capacity2; }
00078 };
00079 }
00080 using misc::CArray2d;
00081 }
00082
00083
00084 #endif
00085
00086
00087
00088