00001 #ifndef Impala_Core_Column_Reverse_h
00002 #define Impala_Core_Column_Reverse_h
00003
00004 #include <iostream>
00005 #include "Core/Column/ColumnTem.h"
00006 #include "Util/Reverse.h"
00007
00008 namespace Impala
00009 {
00010 namespace Core
00011 {
00012 namespace Column
00013 {
00014
00015
00016 template <class C>
00017 inline void
00018 Reverse(C* column, int nrElem)
00019 {
00020 ILOG_VAR(Impala.Core.Column.Reverse);
00021 if (nrElem > column->Capacity())
00022 {
00023 ILOG_ERROR("Too many elements");
00024 return;
00025 }
00026
00027 Util::Reverse(column->GetData(), 0, nrElem - 1);
00028 }
00029
00030 template <class C>
00031 inline void
00032 ReversePart(C* column, int left, int right)
00033 {
00034 ILOG_VAR(Impala.Core.Column.ReversePart);
00035 if (column->Capacity() == 0)
00036 return;
00037
00038 if(left<0 || right>=column->Capacity())
00039 {
00040 ILOG_ERROR("Invalid args");
00041 return;
00042 }
00043
00044 Util::Reverse(column->GetData(), 0, column->Capacity()-1);
00045 }
00046
00048 template <>
00049 inline void
00050 ReversePart(Vector::VectorSet<Array::Array2dScalarReal64>* data, int left,
00051 int right)
00052 {
00053 ILOG_VAR(Impala.Core.Column.ReversePart);
00054 typedef Vector::VectorTem<Array::Array2dScalarReal64::StorType> Type;
00055
00056 if(left<0 || right>=data->Capacity())
00057 {
00058 ILOG_ERROR("Invalid args");
00059 return;
00060 }
00061
00062 while(left<right)
00063 {
00064 Type temp = data->Get(left);
00065 data->Set(left, data->Get(right));
00066 data->Set(right, temp);
00067 ++left;
00068 --right;
00069 }
00070 }
00071
00073 template <>
00074 inline void
00075 Reverse(Vector::VectorSet<Array::Array2dScalarReal64>* data, int nrElem)
00076 {
00077 int left = 0;
00078 int right = nrElem - 1;
00079 ReversePart(data, left, right);
00080 }
00081
00082 template <>
00083 inline void
00084 Reverse(InvalidColumn* data, int nrElem)
00085 {
00086
00087 }
00088
00089 }
00090 }
00091 }
00092
00093 #endif