#include <fem.hpp> // Fortran EMulation library of fable module

namespace dp_example {

using namespace fem::major_types;

struct dynamic_parameters
{
  int dp_example;

  dynamic_parameters(
    fem::command_line_arguments const& command_line_args)
  :
    dp_example(100)
  {
    fem::dynamic_parameters_from(command_line_args, 1)
      .reset_if_given(dp_example)
    ;
  }
};

typedef
  fem::dynamic_parameters_capsule<dynamic_parameters>
    dynamic_parameters_capsule;

struct common :
  fem::common,
  dynamic_parameters_capsule
{
  common(
    int argc,
    char const* argv[])
  :
    fem::common(argc, argv),
    dynamic_parameters_capsule(command_line_args)
  {}
};

void
program_dp_example(
  int argc,
  char const* argv[])
{
  common cmn(argc, argv);
  common_write write(cmn);
  const int array_size = 10;
  write(6, star), "I can store up to", array_size, "numbers";
  int i = fem::int0;
  arr_1d<array_size, float> array(fem::fill0);
  FEM_DO(i, 1, array_size) {
    array(i) = i;
  }
}

} // namespace dp_example

int
main(
  int argc,
  char const* argv[])
{
  return fem::main_with_catch(
    argc, argv,
    dp_example::program_dp_example);
}
