otbOGRDataSourceWrapper.hxx 4.22 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
/*
 * Copyright (C) 2005-2017 Centre National d'Etudes Spatiales (CNES)
 *
 * This file is part of Orfeo Toolbox
 *
 *     https://www.orfeo-toolbox.org/
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
20 21 22


/**\ingroup Geometry
23
 * \file    otbOGRDataSourceWrapper.hxx
24 25 26
 * \internal this file is meant to be included by otbOGRDataSourceWrapper.h
 */

27 28
#ifndef otbOGRDataSourceWrapper_hxx
#define otbOGRDataSourceWrapper_hxx
29

Guillaume Pasero's avatar
Guillaume Pasero committed
30 31
#include "otbOGRDataSourceWrapper.h"

32 33 34 35 36 37 38 39
/*===========================================================================*/
/*===============================[ Includes ]================================*/
/*===========================================================================*/
#include <cassert>
#include "itkMacro.h" // itk::ExceptionObject
#include "ogrsf_frmts.h" // OGRDataSource & OGRLayer

/*===========================================================================*/
40
/*=========================[ otb::ogr::DataSource ]==========================*/
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
46
GDALDataset & otb::ogr::DataSource::ogr()
47
{
48
  assert(m_DataSource && "GDALDataset not initialized");
49 50
  return *m_DataSource;
}
51 52 53 54

inline
otb::ogr::Layer otb::ogr::DataSource::GetLayer(size_t i)
{
55
  assert(int(i) < GetLayersCount() && "Out-of-range index");
56
  OGRLayer * layer_ptr = GetLayerUnchecked(i);
57
  assert(layer_ptr && "No layer returned by OGR");
58
  return otb::ogr::Layer(layer_ptr, IsLayerModifiable(i));
59 60 61 62 63 64 65 66
}

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

67 68 69 70 71 72 73
inline
otb::ogr::Layer const otb::ogr::DataSource::GetLayer(std::string const& name) const
{
  return const_cast <DataSource*>(this)->GetLayer(name);
}


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

inline
81
OGRLayer* otb::ogr::DataSource::GetLayerUnchecked(size_t i) const
82
{
83
  return const_cast <DataSource*>(this)->GetLayerUnchecked(i);
84 85
}

86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111
/*===========================================================================*/
/*====================[ 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
112
{
113
  return m_DataSource == other.m_DataSource && other.m_index == m_index;
114 115
}

116 117 118 119
template <class Value>
void otb::ogr::DataSource::layer_iter<Value>::increment()
{
  assert(m_DataSource
120
    && int(m_index) < m_DataSource->GetLayersCount()
121 122 123
    && "cannot increment past end()");
  ++m_index;
}
124

125 126
template <class Value>
Value otb::ogr::DataSource::layer_iter<Value>::dereference() const
127
{
128
  assert(m_DataSource
129
    && int(m_index) < m_DataSource->GetLayersCount()
130
    && "cannot dereference past end()");
131
  return Value(m_DataSource->GetLayerUnchecked(m_index), m_DataSource->IsLayerModifiable(m_index));
132 133
}

134

135
#endif // otbOGRDataSourceWrapper_hxx