From ecab6dfa0658c9e1cf6ffc176e75dfef3403bcd5 Mon Sep 17 00:00:00 2001
From: Andre Anjos <andre.dos.anjos@gmail.com>
Date: Sat, 29 Mar 2014 06:59:27 +0100
Subject: [PATCH] Remove requirement for std::unique_ptr (fix OSX 10.8.x
 builds)

---
 xbob/learn/libsvm/include/xbob.learn.libsvm/trainer.h | 7 ++++---
 xbob/learn/libsvm/pytrainer.cpp                       | 8 ++++----
 xbob/learn/libsvm/trainer.cpp                         | 7 +++----
 3 files changed, 11 insertions(+), 11 deletions(-)

diff --git a/xbob/learn/libsvm/include/xbob.learn.libsvm/trainer.h b/xbob/learn/libsvm/include/xbob.learn.libsvm/trainer.h
index bbb1c91..ea6ea45 100644
--- a/xbob/learn/libsvm/include/xbob.learn.libsvm/trainer.h
+++ b/xbob/learn/libsvm/include/xbob.learn.libsvm/trainer.h
@@ -11,7 +11,6 @@
 #define BOB_LEARN_LIBSVM_TRAINER_H
 
 #include <vector>
-#include <memory>
 #include "machine.h"
 
 namespace bob { namespace learn { namespace libsvm {
@@ -55,15 +54,17 @@ namespace bob { namespace learn { namespace libsvm {
        * the number of classes is greater than 2, labels are picked starting
        * from 1 (i.e., 1, 2, 3, 4, etc.). If what you want is regression, the
        * size of the input data array should be 1.
+       *
+       * Returns a new object you must deallocate yourself.
        */
-      std::unique_ptr<bob::learn::libsvm::Machine> train
+      bob::learn::libsvm::Machine* train
         (const std::vector<blitz::Array<double,2> >& data) const;
 
       /**
        * This version accepts scaling parameters that will be applied
        * column-wise to the input data.
        */
-      std::unique_ptr<bob::learn::libsvm::Machine> train
+      bob::learn::libsvm::Machine* train
         (const std::vector<blitz::Array<double,2> >& data,
          const blitz::Array<double,1>& input_subtract,
          const blitz::Array<double,1>& input_division) const;
diff --git a/xbob/learn/libsvm/pytrainer.cpp b/xbob/learn/libsvm/pytrainer.cpp
index fb897de..e89910d 100644
--- a/xbob/learn/libsvm/pytrainer.cpp
+++ b/xbob/learn/libsvm/pytrainer.cpp
@@ -649,17 +649,17 @@ static PyObject* PyBobLearnLibsvmTrainer_train
 
   /** all basic checks are done, can call the machine now **/
   try {
+    bob::learn::libsvm::Machine* machine;
     if (subtract && divide) {
-      auto machine = self->cxx->train(Xseq,
+      machine = self->cxx->train(Xseq,
           *PyBlitzArrayCxx_AsBlitz<double,1>(subtract),
           *PyBlitzArrayCxx_AsBlitz<double,1>(divide)
           );
-      return PyBobLearnLibsvmMachine_NewFromMachine(machine.release());
     }
     else {
-      auto machine = self->cxx->train(Xseq);
-      return PyBobLearnLibsvmMachine_NewFromMachine(machine.release());
+      machine = self->cxx->train(Xseq);
     }
+    return PyBobLearnLibsvmMachine_NewFromMachine(machine);
   }
   catch (std::exception& e) {
     PyErr_SetString(PyExc_RuntimeError, e.what());
diff --git a/xbob/learn/libsvm/trainer.cpp b/xbob/learn/libsvm/trainer.cpp
index 9c592e4..f870395 100644
--- a/xbob/learn/libsvm/trainer.cpp
+++ b/xbob/learn/libsvm/trainer.cpp
@@ -202,7 +202,7 @@ static void svm_model_free(svm_model*& m) {
 #endif
 }
 
-std::unique_ptr<bob::learn::libsvm::Machine> bob::learn::libsvm::Trainer::train
+bob::learn::libsvm::Machine* bob::learn::libsvm::Trainer::train
 (const std::vector<blitz::Array<double, 2> >& data,
  const blitz::Array<double,1>& input_subtraction,
  const blitz::Array<double,1>& input_division) const {
@@ -253,8 +253,7 @@ std::unique_ptr<bob::learn::libsvm::Machine> bob::learn::libsvm::Trainer::train
   boost::shared_ptr<svm_model> new_model =
     bob::learn::libsvm::svm_unpickle(bob::learn::libsvm::svm_pickle(model));
 
-  std::unique_ptr<bob::learn::libsvm::Machine> retval
-    (new bob::learn::libsvm::Machine(new_model));
+  auto retval = new bob::learn::libsvm::Machine(new_model);
 
   //sets up the scaling parameters given as input
   retval->setInputSubtraction(input_subtraction);
@@ -263,7 +262,7 @@ std::unique_ptr<bob::learn::libsvm::Machine> bob::learn::libsvm::Trainer::train
   return retval;
 }
 
-std::unique_ptr<bob::learn::libsvm::Machine> bob::learn::libsvm::Trainer::train
+bob::learn::libsvm::Machine* bob::learn::libsvm::Trainer::train
 (const std::vector<blitz::Array<double,2> >& data) const {
   int n_features = data[0].extent(blitz::secondDim);
   blitz::Array<double,1> sub(n_features);
-- 
GitLab