// Glib::ValueArray is deprecated, but let's keep the test.
// The recommended replacement is std::vector<> which requires no test here.
#undef GLIBMM_DISABLE_DEPRECATED

#include <glibmm.h>
#include <iostream>

#ifdef GLIBMM_DISABLE_DEPRECATED
int
main(int, char**)
{
  // If glibmm is configured with --disable-deprecated-api, GLIBMM_DISABLE_DEPRECATED
  // is defined in glibmm.h (actually in glibmmconfig.h). The undef at the start of
  // this file has no effect.
  return 77; // Tell automake's test harness to skip this test.
}

#else

// Use this line if you want debug output:
// std::ostream& ostr = std::cout;

// This seems nicer and more useful than putting an ifdef around the use of ostr:
std::stringstream debug;
std::ostream& ostr = debug;

int
on_compare(const Glib::ValueBase& v1, const Glib::ValueBase& v2)
{
  const Glib::Value<int>& intVal1 = static_cast<const Glib::Value<int>&>(v1);
  const Glib::Value<int>& intVal2 = static_cast<const Glib::Value<int>&>(v2);

  int int1 = intVal1.get();
  int int2 = intVal2.get();

  if (int1 < int2)
    return -1;
  else if (int1 == int2)
    return EXIT_SUCCESS;
  else
    return 1;
}

int
main(int, char**)
{
  const int VALUES_COUNT = 10;

  Glib::init();

  Glib::Value<int> values[VALUES_COUNT];
  Glib::ValueArray array;

  for (int i = 0; i < VALUES_COUNT; i++)
  {
    values[i].init(Glib::Value<int>::value_type());
    values[i].set(i + 1); //  (i + 1) ==> Set to natural counting numbers.
    array.prepend(values[i]);
  }

  ostr << "Array members before sorting:" << std::endl;

  for (int i = 0; i < VALUES_COUNT; i++)
  {
    Glib::ValueBase value;

    if (!array.get_nth(i, value))
    {
      std::cerr << "Error getting element " << i << " of value array." << std::endl;
      return EXIT_FAILURE;
      break;
    }

    auto int_val = static_cast<Glib::Value<int>&>(value);
    ostr << int_val.get() << " ";
  }
  ostr << std::endl; // End of line for list of array elements.

  // Sort array and remove last element:
  array.sort(sigc::ptr_fun(&on_compare)).remove(VALUES_COUNT - 1);

  ostr << "Array members after sorting without last element:" << std::endl;

  for (int i = 0; i < VALUES_COUNT - 1; i++)
  {
    Glib::ValueBase value;

    if (!array.get_nth(i, value))
    {
      std::cerr << "Error getting element " << i << " of value array." << std::endl;
      return EXIT_FAILURE;
      break;
    }

    auto int_val = static_cast<Glib::Value<int>&>(value);
    ostr << int_val.get() << " ";
  }
  ostr << std::endl; // End of line for list of array elements.

  return EXIT_SUCCESS;
}
#endif // GLIBMM_DISABLE_DEPRECATED
