blob: 48b315d65cef68b4f7373402c6752ab4d5d4da97 [file] [log] [blame]
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you 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.
*/
#ifndef DRILL_COLLECTIONSIMPL_H
#define DRILL_COLLECTIONSIMPL_H
#include <iterator>
#include <drill/collections.hpp>
namespace Drill {
namespace impl {
template<typename T, typename Iterator>
class DrillContainerIterator: public DrillIteratorImpl<T> {
public:
typedef DrillContainerIterator<T, Iterator> type;
typedef DrillIteratorImpl<T> supertype;
typedef typename supertype::iterator iterator;
typedef typename iterator::value_type value_type;
typedef typename iterator::reference reference;
typedef typename iterator::pointer pointer;
DrillContainerIterator(Iterator it): supertype(), m_it(it) {};
operator typename DrillIteratorImpl<const T>::iterator_ptr() const { return typename DrillIteratorImpl<const T>::iterator_ptr(new DrillContainerIterator<const T, Iterator>(m_it)); }
reference operator*() const { return m_it.operator *();}
pointer operator->() const { return m_it.operator->(); }
iterator& operator++() { m_it++; return *this; }
bool operator==(const iterator& x) const {
const type& other(dynamic_cast<const type&>(x));
return m_it == other.m_it;
}
bool operator!=(const iterator& x) const { return !(*this==x); }
private:
Iterator m_it;
};
template<typename T, typename Container>
class DrillContainerCollection: public DrillCollectionImpl<T> {
public:
typedef DrillCollectionImpl<T> supertype;
typedef typename supertype::value_type value_type;
typedef typename supertype::iterator iterator;
typedef typename supertype::const_iterator const_iterator;
typedef typename supertype::iterator_ptr iterator_ptr;
typedef typename supertype::const_iterator_ptr const_iterator_ptr;
DrillContainerCollection(): supertype(), m_container() {};
Container& operator*() { return &m_container; }
const Container& operator*() const { return &m_container; }
Container* operator->() { return &m_container; }
const Container* operator->() const { return &m_container; }
iterator_ptr begin() { return iterator_ptr(new IteratorImpl(m_container.begin())); }
const_iterator_ptr begin() const { return const_iterator_ptr(new ConstIteratorImpl(m_container.begin())); }
iterator_ptr end() { return iterator_ptr(new IteratorImpl(m_container.end())); }
const_iterator_ptr end() const { return const_iterator_ptr(new ConstIteratorImpl(m_container.end())); }
private:
typedef DrillContainerIterator<value_type, typename Container::iterator> IteratorImpl;
typedef DrillContainerIterator<const value_type, typename Container::const_iterator> ConstIteratorImpl;
Container m_container;
};
} /* namespace impl */
/**
* Drill collection backed up by a vector
* Offer a view over a collection of Iface instances,
* where concrete implementation of Iface is T
*/
template<typename Iface, typename T>
class DrillVector: public DrillCollection<Iface> {
public:
DrillVector(): DrillCollection<Iface>(ImplPtr(new Impl())) {};
void clear() {
Impl& impl = static_cast<Impl&>(**this);
impl->clear();
}
void push_back( const T& value ) {
Impl& impl = static_cast<Impl&>(**this);
impl->push_back(value);
}
void reserve(std::size_t new_cap) {
Impl& impl = static_cast<Impl&>(**this);
impl->reserve(new_cap);
}
private:
typedef impl::DrillContainerCollection<Iface, std::vector<T> > Impl;
typedef boost::shared_ptr<Impl> ImplPtr;
};
}
#endif /* DRILL_COLLECTIONSIMPL_H */