// This is core/vnl/io/vnl_io_nonlinear_minimizer.h
#ifndef vnl_io_nonlinear_minimizer_h
#define vnl_io_nonlinear_minimizer_h
//:
// \file
// \author dac
// \date 21-Mar-2001

#include <string>
#include <vsl/vsl_binary_io.h>
#include <vnl/vnl_nonlinear_minimizer.h>
#ifdef _MSC_VER
#  include <vcl_msvc_warnings.h>
#endif

//: Base for objects which provide IO
//  for classes derived from vnl_nonlinear_minimizer
class vnl_io_nonlinear_minimizer
{
 public:
  //: Constructor
  vnl_io_nonlinear_minimizer() = default;

  //: Destructor
  virtual ~vnl_io_nonlinear_minimizer() = default;

  //: Create new object of type vnl_nonlinear_minimizer on heap
  virtual vnl_nonlinear_minimizer* new_object() const;

  //: Write derived class to os using vnl_nonlinear_minimizer reference
  virtual void b_write_by_base(vsl_b_ostream& os,
                               const vnl_nonlinear_minimizer& base) const;

  //: Write derived class to os using vnl_nonlinear_minimizer reference
  virtual void b_read_by_base(vsl_b_istream& is,
                              vnl_nonlinear_minimizer& base) const;

  //: Print summary of derived class to os
  //  using vnl_nonlinear_minimizer reference
  virtual void print_summary_by_base(std::ostream& os,
                                     const vnl_nonlinear_minimizer& base) const;

  //: Copy this object onto the heap and return a pointer
  virtual vnl_io_nonlinear_minimizer* clone() const;

  //: Return name of class for which this object provides IO
  virtual std::string target_classname() const { return "vnl_nonlinear_minimizer"; }

  //: Return true if b is of class target_classname()
  //  Typically this will just be "return b.is_a()==target_classname()"
  //  However, third party libraries may use a different system
  virtual bool is_io_for(const vnl_nonlinear_minimizer& b) const
  { return b.is_a()==target_classname(); }
};

//: Add example object to list of those that can be loaded
//  The vsl_binary_loader must see an example of each derived class
//  before it knows how to deal with them.
//  A clone is taken of b
void vsl_add_to_binary_loader(const vnl_io_nonlinear_minimizer& b);

//: Binary save to stream by vnl_nonlinear_minimizer pointer
void vsl_b_write(vsl_b_ostream &os, const vnl_nonlinear_minimizer * b);

//: Binary read from stream by vnl_nonlinear_minimizer pointer
void vsl_b_read(vsl_b_istream &is, vnl_nonlinear_minimizer* &b);

//: Print summary to stream by vnl_nonlinear_minimizer pointer
void vsl_print_summary(std::ostream &os, const vnl_nonlinear_minimizer * b);

//: Binary save vnl_real_polynomial to stream.
void vsl_b_write(vsl_b_ostream &os, const vnl_nonlinear_minimizer & v);

//: Binary load vnl_real_polynomial from stream.
void vsl_b_read(vsl_b_istream &is, vnl_nonlinear_minimizer & v);

//: Print human readable summary of object to a stream
void vsl_print_summary(std::ostream& os,const vnl_nonlinear_minimizer & b);

#endif // vnl_io_nonlinear_minimizer_h
