.. namespace:: units

Working with Legacy Interfaces
==============================

In case we are working with a legacy/unsafe interface we may be forced to
extract the :term:`value of a quantity` with :func:`quantity::count()` or to
extract the value of a `quantity_point` with :func:`quantity_point::relative()`
and pass it to the library's output:

.. code-block::
    :caption: legacy.h

    namespace legacy {

    void print_eta(double speed_in_mps);
    void set_path_position(double meter);

    } // namespace legacy

.. code-block::

    #include "legacy.h"
    #include <units/physical/si/si.h>
    #include <units/quantity_point.h>

    using namespace units::physical;

    constexpr Speed auto avg_speed(Length auto d, Time auto t)
    {
      return d / t;
    }

    void print_eta(Length auto d, Time auto t)
    {
      Speed auto v = avg_speed(d, t);
      legacy::print_eta(quantity_cast<si::metre_per_second>(v).count());
    }

    template<QuantityPoint QP>
      requires Length<typename QP::quantity_type>
    void set_path_position(QP p)
    {
      legacy::set_path_position(quantity_point_cast<si::metre>(p).relative().count());
    }

.. important::

    When dealing with a quantity of an unknown ``auto`` type please remember
    to always use `quantity_cast` to cast it to a desired unit before calling
    `quantity::count()` and passing the raw value to the legacy/unsafe interface.
