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 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82
|
#pragma once
#include <string>
#include <vector>
#include <eccodes.h>
namespace glGrib
{
class Container
{
public:
static Container * create (const std::string &, bool = false);
static void remove (Container *);
static void clear ();
explicit Container (const std::string & _file) : file (_file) {}
virtual ~Container () {}
virtual codes_handle * getHandleByExt (const std::string &) = 0;
virtual bool hasExt (const std::string &) const = 0;
const std::string & getFile () const { return file; }
virtual void buildIndex () = 0;
virtual const std::string & getNextExt (const std::string &) = 0;
virtual const std::string & getPrevExt (const std::string &) = 0;
class _iterator
{
public:
virtual void incr () = 0;
virtual const std::string & str () = 0;
virtual bool isEqual (const _iterator *) const = 0;
virtual ~_iterator () {}
virtual bool last () const = 0;
};
public:
class iterator
{
public:
iterator () {}
explicit iterator (_iterator * _it) : it (_it) {}
iterator & operator++ ()
{
it->incr ();
return *this;
}
virtual ~iterator ()
{
delete it;
}
const std::string & operator* ()
{
return it->str ();
}
bool operator!= (const iterator & rhs) const
{
return ! operator== (rhs);
}
bool operator== (const iterator & rhs) const
{
// Both at end
if ((it == nullptr) && (rhs.it == nullptr))
return true;
// At end or not
if (rhs.it == nullptr)
return it->last ();
// At end ?
if (it == nullptr)
return rhs.it->last ();
return it->isEqual (rhs.it);
}
private:
_iterator * it = nullptr;
};
virtual iterator begin () = 0;
virtual iterator end () = 0;
private:
std::string file;
};
}
|