blob: 138bd439282dd92805f3425d184c621cb6499353 [file] [log] [blame]
//
// See README-LCALS_license.txt for access and distribution restrictions
//
//
// Source file containing LCALS traversal method implementations
// used in forall-hybrid loop variants.
//
#include "LCALSTraversalMethods.hxx"
#include <iostream>
/*
*************************************************************************
*
* HybridIndexSet class dtor.
*
*************************************************************************
*/
HybridIndexSet::~HybridIndexSet()
{
const int num_segs = m_segments.size();
for ( int isi = 0; isi < num_segs; ++isi ) {
Segment& seg = m_segments[isi];
switch ( seg.m_type ) {
case _Range_ : {
if ( seg.m_segment ) {
RangeIndexSet* is =
const_cast<RangeIndexSet*>(
static_cast<const RangeIndexSet*>(seg.m_segment)
);
delete is;
}
break;
}
case _RangeStride_ : {
if ( seg.m_segment ) {
RangeStrideIndexSet* is =
const_cast<RangeStrideIndexSet*>(
static_cast<const RangeStrideIndexSet*>(seg.m_segment)
);
delete is;
}
break;
}
default : {
std::cout << "\t HybridIndexSet dtor: case not implemented!!\n";
}
} // iterate over segments of hybrid index set
}
}
/*
*************************************************************************
*
* Private helper function to copy hybrid index set segments.
*
*************************************************************************
*/
void HybridIndexSet::copySegments(const HybridIndexSet& other)
{
const int num_segs = m_segments.size();
for ( int isi = 0; isi < num_segs; ++isi ) {
const Segment& seg = m_segments[isi];
switch ( seg.m_type ) {
case _Range_ : {
addIndexSet(*static_cast<const RangeIndexSet*>(seg.m_segment));
break;
}
case _RangeStride_ : {
addIndexSet(*static_cast<const RangeStrideIndexSet*>(seg.m_segment));
break;
}
default : {
std::cout << "\t HybridIndexSet copySegments: case not implemented!!\n";
}
} // iterate over segments of hybrid index set
}
}
/*
*************************************************************************
*
* Methods to add indices to hybrid index set.
*
*************************************************************************
*/
void HybridIndexSet::addIndexSet(const RangeIndexSet& index_set)
{
RangeIndexSet* new_is =
new RangeIndexSet(index_set.getBegin(), index_set.getEnd());
m_segments.push_back( Segment( _Range_, new_is ) );
m_len += new_is->getLength();
}
void HybridIndexSet::addRangeIndices(Index_type begin, Index_type end)
{
RangeIndexSet* new_is = new RangeIndexSet(begin, end);
m_segments.push_back( Segment( _Range_, new_is ) );
m_len += new_is->getLength();
}
void HybridIndexSet::addIndexSet(const RangeStrideIndexSet& index_set)
{
RangeStrideIndexSet* new_is =
new RangeStrideIndexSet(index_set.getBegin(), index_set.getEnd(),
index_set.getStride());
m_segments.push_back( Segment( _RangeStride_, new_is ) );
m_len += new_is->getLength() / new_is->getStride();
}
void HybridIndexSet::addRangeStrideIndices(Index_type begin, Index_type end,
Index_type stride)
{
RangeStrideIndexSet* new_is = new RangeStrideIndexSet(begin, end, stride);
m_segments.push_back( Segment( _RangeStride_, new_is ) );
m_len += new_is->getLength() / new_is->getStride();
}