#pragma once

#include <boost/program_options.hpp>

namespace trygvis {
namespace apps {

namespace po = boost::program_options;

class app_execution {
public:
    app_execution(po::options_description desc, po::variables_map vm) : desc(desc), vm(vm) {
    }

    po::options_description desc;
    po::variables_map vm;

    void usage();
};

class app {
public:

    virtual void add_options(po::options_description_easy_init &options) {
    };

    virtual void add_extra_options(po::options_description &options) {
    };

    virtual int main(app_execution &execution) = 0;
};

int launch_app(int argc, char *argv[], app &app);

std::string get_hostname();

template<typename T>
class noop_delete {
public:
    void operator()(T *) const {
    }
};

static inline void noop_deleter(void *) {
}

}
}