#ifndef cathlibcpp_hoistalgo_H
#define cathlibcpp_hoistalgo_H

// File:       hoistalgo.h
// Author:     (c) Miles Sabin, 1997
// Purpose:    hoisted algorithms


#ifndef included_stddef_H
#define included_stddef_H
#include <stddef.h>                    // for size_t, ptrdiff_t
#endif

#ifndef cathlibcpp_bool_H
#include "bool.h"
#endif

#ifndef cathlibcpp_config_H
#include "config.h"
#endif


class HoistBinaryPredicateProtocol;
class HoistConstructorDestructorProtocol;


struct HoistAlgorithm
{
  static void destroy
    (HoistConstructorDestructorProtocol const& hoist_ctdt,
     void* first, void* last);

  static void* copy
    (HoistConstructorDestructorProtocol const& hoist_ctdt,
     void const* first, void const* last, void* result);

  static void* copy_backward
    (HoistConstructorDestructorProtocol const& hoist_ctdt,
     void const* first, void const* last, void* result);

  static void* uninitialized_copy
    (HoistConstructorDestructorProtocol const& hoist_ctdt,
     void const* first, void const* last, void* result);

  static void  uninitialized_fill
    (HoistConstructorDestructorProtocol const& hoist_ctdt,
     void* first, void* last, void const* value);

  static void  uninitialized_fill
    (HoistConstructorDestructorProtocol const& hoist_ctdt,
     void* position, size_t n, void const* value);

  static ptrdiff_t member_base_offset
    (HoistConstructorDestructorProtocol const& hoist_ctdt,
     ptrdiff_t previous_member_base_offset, size_t previous_member_size);

  static bool equal
    (HoistConstructorDestructorProtocol const& hoist_ctdt, HoistBinaryPredicateProtocol const& hoist_comparator,
     void const* first1, void const* last1, void const* first2);

  static bool lexicographical_compare
    (HoistConstructorDestructorProtocol const& hoist_ctdt, HoistBinaryPredicateProtocol const& hoist_comparator,
     void const* first1, void const* last1, void const* first2, void const* last2);
};

#endif
