Abstract box class

  type, abstract :: box_t
    private
    integer, public :: dim                          !< dimensions of the space the box lives in
    logical :: inside_out = .false.                 !< if the box is inside out or not
    real(real64), allocatable, public :: bounding_box_l(:) !< Half lengths of the bounding box that contains the
    !!                                                 box. Note that this box always contains the origin
    !!                                                 and is symmetrical with respect to it.
  contains
    procedure(box_contains_points),        deferred :: contains_points
    procedure(box_bounds),                 deferred :: bounds
    procedure(box_write_info),             deferred :: write_info
    procedure(box_short_info),             deferred :: short_info
    procedure :: get_surface_points => box_get_surface_points
    procedure :: get_surface_point_info => box_get_surface_point_info
    procedure, non_overridable :: contains_point => box_contains_point
    procedure, non_overridable :: is_inside_out => box_is_inside_out
    procedure, non_overridable :: turn_inside_out => box_turn_inside_out
  end type box_t