#include <vector>
#include <sigc++/signal.h>
#include <msp/strings/lexicalcast.h>
+#include "mspgltk_api.h"
namespace Msp {
namespace GLtk {
-class ListData
+class MSPGLTK_API ListData
{
public:
- sigc::signal<void, unsigned> signal_item_added;
- sigc::signal<void, unsigned> signal_item_removed;
+ sigc::signal<void, std::size_t> signal_item_added;
+ sigc::signal<void, std::size_t> signal_item_removed;
sigc::signal<void> signal_cleared;
- sigc::signal<void, unsigned> signal_refresh_item;
+ sigc::signal<void, std::size_t> signal_refresh_item;
protected:
- ListData() { }
+ ListData() = default;
public:
- virtual ~ListData() { }
+ virtual ~ListData() = default;
- virtual unsigned size() const = 0;
- virtual std::string get_string(unsigned) const = 0;
- void refresh(unsigned i) const
+ virtual std::size_t size() const = 0;
+ virtual std::string get_string(std::size_t) const = 0;
+ void refresh(std::size_t i) const
{
if(i>=size())
throw std::out_of_range("ListData::refresh");
protected:
std::vector<T> items;
- ListDataStore() { }
+ ListDataStore() = default;
public:
void append(const T &v) { insert(items.size(), v); }
- void insert(unsigned i, const T & v)
+ void insert(std::size_t i, const T &v)
{
if(i>items.size())
throw std::out_of_range("ListDataStore::insert");
signal_item_added.emit(i);
}
- const T &get(unsigned i) const
+ const T &get(std::size_t i) const
{
if(i>=items.size())
throw std::out_of_range("ListDataStore::get");
return items[i];
}
- int find(const T &v) const
+ std::size_t find(const T &v) const
{
- for(unsigned i=0; i<items.size(); ++i)
+ for(std::size_t i=0; i<items.size(); ++i)
if(items[i]==v)
return i;
- return -1;
+ return std::numeric_limits<std::size_t>::max();
}
using ListData::refresh;
void refresh(const T &v) const
{
- int i = find(v);
- if(i>=0)
+ std::size_t i = find(v);
+ if(i<items.size())
signal_refresh_item.emit(i);
}
- void remove(unsigned i)
+ void remove(std::size_t i)
{
if(i>=items.size())
throw std::out_of_range("ListDataStore::remove");
signal_cleared.emit();
}
- virtual unsigned size() const { return items.size(); }
+ std::size_t size() const override { return items.size(); }
};
template<typename T>
class BasicListData: public ListDataStore<T>
{
public:
- virtual std::string get_string(unsigned i) const
+ virtual std::string get_string(std::size_t i) const
{ return lexical_cast<std::string>(this->get(i)); }
};
typedef std::string Func(const T &);
private:
- Func *func;
+ Func *func = 0;
public:
FunctionListData(Func f): func(f) { }
- virtual std::string get_string(unsigned i) const
+ std::string get_string(std::size_t i) const override
{ return func(this->get(i)); }
};