otbOGRDataSourceWrapper.txx 3.99 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
/*=========================================================================

  Program:   ORFEO Toolbox
  Language:  C++
  Date:      $Date$
  Version:   $Revision$


  Copyright (c) Centre National d'Etudes Spatiales. All rights reserved.
  See OTBCopyright.txt for details.


     This software is distributed WITHOUT ANY WARRANTY; without even
     the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
     PURPOSE.  See the above copyright notices for more information.

=========================================================================*/

/**\ingroup Geometry
 * \file    otbOGRDataSourceWrapper.txx
 * \internal this file is meant to be included by otbOGRDataSourceWrapper.h
 */

#ifndef __otbOGRDataSourceWrapper_txx
#define __otbOGRDataSourceWrapper_txx

/*===========================================================================*/
/*===============================[ Includes ]================================*/
/*===========================================================================*/
#include <cassert>
#include "itkMacro.h" // itk::ExceptionObject
#include "ogrsf_frmts.h" // OGRDataSource & OGRLayer

/*===========================================================================*/
35
/*=========================[ otb::ogr::DataSource ]==========================*/
36
/*===========================================================================*/
37 38 39 40 41 42 43 44 45
// These function definitions are inline so assert() will be expanded according
// to the compilation mode of the client code.

inline
OGRDataSource & otb::ogr::DataSource::ogr()
{
  assert(m_DataSource && "OGRDataSource not initialized");
  return *m_DataSource;
}
46 47 48 49

inline
otb::ogr::Layer otb::ogr::DataSource::GetLayer(size_t i)
{
50
  assert(int(i) < GetLayersCount() && "Out-of-range index");
51
  OGRLayer * layer_ptr = GetLayerUnchecked(i);
52
  assert(layer_ptr && "No layer returned by OGR");
53 54 55 56 57 58 59 60 61
  return otb::ogr::Layer(layer_ptr);
}

inline
otb::ogr::Layer const otb::ogr::DataSource::GetLayer(size_t i) const
{
  return const_cast <DataSource*>(this)->GetLayer(i);
}

62 63 64 65 66 67 68
inline
otb::ogr::Layer const otb::ogr::DataSource::GetLayer(std::string const& name) const
{
  return const_cast <DataSource*>(this)->GetLayer(name);
}


69 70 71 72 73 74 75
inline
otb::ogr::Layer const otb::ogr::DataSource::GetLayerChecked(size_t i) const
{
  return const_cast <DataSource*>(this)->GetLayerChecked(i);
}

inline
76
OGRLayer* otb::ogr::DataSource::GetLayerUnchecked(size_t i) const
77
{
78
  return const_cast <DataSource*>(this)->GetLayerUnchecked(i);
79 80
}

81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106
/*===========================================================================*/
/*====================[ otb::ogr::DataSource/iterators ]=====================*/
/*===========================================================================*/
template <class Value>
otb::ogr::DataSource::layer_iter<Value>::layer_iter(container_type & datasource, size_t index)
: m_DataSource(&datasource), m_index(index)
{}

template <class Value>
otb::ogr::DataSource::layer_iter<Value>::layer_iter()
: m_DataSource(0), m_index(0)
{}

template <class Value>
template <class OtherValue> otb::ogr::DataSource::layer_iter<Value>::layer_iter(
  otb::ogr::DataSource::layer_iter<OtherValue> const& other,
  typename boost::enable_if<boost::is_convertible<OtherValue*,Value*>
  , enabler
  >::type
)
: m_DataSource(other.m_DataSource), m_index(other.m_index)
{}

template <class Value>
template <class OtherValue>
bool otb::ogr::DataSource::layer_iter<Value>::equal(layer_iter<OtherValue> const& other) const
107
{
108
  return m_DataSource == other.m_DataSource && other.m_index == m_index;
109 110
}

111 112 113 114
template <class Value>
void otb::ogr::DataSource::layer_iter<Value>::increment()
{
  assert(m_DataSource
115
    && int(m_index) < m_DataSource->GetLayersCount()
116 117 118
    && "cannot increment past end()");
  ++m_index;
}
119

120 121
template <class Value>
Value otb::ogr::DataSource::layer_iter<Value>::dereference() const
122
{
123
  assert(m_DataSource
124
    && int(m_index) < m_DataSource->GetLayersCount()
125 126
    && "cannot dereference past end()");
  return Value(m_DataSource->GetLayerUnchecked(m_index));
127 128
}

129 130

#endif // __otbOGRDataSourceWrapper_txx