Pallas Solver  0.1
C++ Global Optimization Algorithms
history_concept.h
1 // Pallas Solver
2 // Copyright 2015. All rights reserved.
3 //
4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions are met:
6 //
7 // * Redistributions of source code must retain the above copyright notice,
8 // this list of conditions and the following disclaimer.
9 // * Redistributions in binary form must reproduce the above copyright notice,
10 // this list of conditions and the following disclaimer in the documentation
11 // and/or other materials provided with the distribution.
12 //
13 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
14 // AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
15 // IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
16 // ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
17 // LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18 // CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19 // SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20 // INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21 // CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22 // ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
23 // POSSIBILITY OF SUCH DAMAGE.
24 //
25 // Author: ryan.latture@gmail.com (Ryan Latture)
26 //
27 // Adapted from Value Semantics and Concept-based Polymorphism by Sean Parent
28 // Copyright 2013 Adobe Systems Incorporated
29 // Distributed under the MIT License (see license at http://stlab.adobe.com/licenses.html)
30 // original code can be found at:
31 // https://raw.githubusercontent.com/wiki/sean-parent/sean-parent.github.io/presentations/2013-09-06-inheritance/value-semantics-unique.cpp
32 
33 #ifndef PALLAS_HISTORY_CONCEPT_H
34 #define PALLAS_HISTORY_CONCEPT_H
35 
36 #include <memory>
37 #include "pallas/types.h"
38 
39 namespace pallas {
40 
42  public:
43  template <typename T>
44  HistoryConcept(T x) : self_(new model<T>(std::move(x)))
45  { }
46 
47  HistoryConcept(const HistoryConcept& x) : self_(x.self_->copy_())
48  { }
49  HistoryConcept(HistoryConcept&&) noexcept = default;
50 
51  HistoryConcept& operator=(const HistoryConcept& x)
52  { HistoryConcept tmp(x); *this = std::move(tmp); return *this; }
53  HistoryConcept& operator=(HistoryConcept&&) noexcept = default;
54 
55  friend void dump(const HistoryConcept &x, HistoryWriter& writer)
56  { x.self_->dump_(writer); }
57 
58  private:
59  struct concept_t {
60  virtual ~concept_t() = default;
61  virtual concept_t* copy_() const = 0;
62  virtual void dump_(HistoryWriter&) const = 0;
63  };
64  template <typename T>
65  struct model : concept_t {
66  model(T x) : data_(std::move(x)) { }
67  concept_t* copy_() const { return new model(*this); }
68  void dump_(HistoryWriter &writer) const
69  { dump(data_, writer); }
70 
71  T data_;
72  };
73 
74  std::unique_ptr<const concept_t> self_;
75  };
76 
80  using HistorySeries = std::vector<HistoryConcept>;
81 
88  void dump(const HistorySeries& history, HistoryWriter& writer);
89 } // namespace pallas
90 
91 #endif //PALLAS_HISTORY_CONCEPT_H
Definition: basinhopping.h:51
Definition: history_concept.h:41
void dump(const Basinhopping::HistoryOutput &h, HistoryWriter &writer)
Dumps the system state contained in the history output into the stream contained by the writer...
Definition: basinhopping.cc:323