more work on seq_span
[mussa.git] / py / seq_span.cpp
index aa484c99ddba1a965f16eaa122a08e3974a0544f..d3e0b5b9bcb1563ebb162f08912e910447dfaabd 100644 (file)
@@ -2,6 +2,7 @@
 
 #include <boost/python.hpp>
 #include <boost/python/return_value_policy.hpp>
+#include <boost/python/manage_new_object.hpp>
 
 #include <boost/python/register_ptr_to_python.hpp>
 using namespace boost::python;
@@ -10,9 +11,25 @@ using namespace boost::python;
 
 #include "stl_container_adapter.hpp"
 
+SeqSpanRef seq_span_factory(
+  const std::string& s, 
+  AlphabetRef a = dna_alphabet, 
+  SeqSpan::strand_type strand = SeqSpan::PlusStrand)
+{
+  SeqSpanRef seq(new SeqSpan(s, a, strand));
+  return seq;
+}
+
+BOOST_PYTHON_FUNCTION_OVERLOADS(
+  seq_span_factory_overloads, 
+  seq_span_factory,
+  1, // minimum arguments
+  3 // maximum arguments
+);
+
 void export_seq_span()
 {
-  enum_<SeqSpan::strand_type>("strand_type")
+  enum_<SeqSpan::strand_type>("strand")
     .value("unknown", SeqSpan::UnknownStrand)
     .value("minus", SeqSpan::MinusStrand)
     .value("plus", SeqSpan::PlusStrand)
@@ -22,16 +39,19 @@ void export_seq_span()
     .value("single", SeqSpan::SingleStrand)
     ;
 
+  def("SeqSpan", seq_span_factory, 
+      seq_span_factory_overloads(args("sequence", "alphabet", "strand"))
+      );
 
-  class_<SeqSpan>("SeqSpan", 
-                  init<std::string, optional<AlphabetRef, 
-                                             SeqSpan::strand_type> 
-                      >() )
-    .def("__len__", &SeqSpan::size)
+  class_<SeqSpan>("_SeqSpan", no_init)
     .def("__getitem__", &std_item<SeqSpan>::get_const,
         return_value_policy<copy_const_reference>())
+    .def("__len__", &SeqSpan::size)
     .def("__str__", &SeqSpan::sequence)
     .def("empty", &SeqSpan::empty)
+    //.add_property("alphabet", 
+    //              make_getter(&SeqSpan::get_alphabet,
+    //                          return_value_policy<copy_const_reference>()))
     .add_property("start", &SeqSpan::start, &SeqSpan::setStart,
                   "start position relative to root sequence")
     .add_property("stop", &SeqSpan::stop, &SeqSpan::setStop,
@@ -43,10 +63,11 @@ void export_seq_span()
                   "start position relative to parent sequence")
     .add_property("parentStop", &SeqSpan::parentStop, &SeqSpan::setParentStop,
                   "one past the last position relative to the parent sequence.")
-    .add_property("parent", &SeqSpan::parent)
-
+    // doesn't work because I keep getting new python objects for the same
+    // shared ptr
+    //.def("parent", &SeqSpan::parent)
     .def("subseq", &SeqSpan::subseq)
     ;
  
-  register_ptr_to_python< boost::shared_ptr<SeqSpan> >();
+  register_ptr_to_python< SeqSpanRef >();
 }