diff libinterp/octave-value/ov-classdef.cc @ 16690:1c45e22fc444 classdef

Implement meta.package.getAllPackages() method. * libinterp/interpfcn/load-path.h (load_path::get_all_package_names): New static method. (load_path::do_get_all_package_names): New method. * libinterp/interpfcn/load-path.cc (load_path::do_get_all_package_names): New method. * libinterp/octave-value/ov-classdef/cc (package_getAllPackages): New static function. (install_classdef): Install it as "meta.package,getAllPackages" method.
author Michael Goffioul <michael.goffioul@gmail.com>
date Mon, 20 May 2013 14:37:25 -0400
parents 04e110438873
children 50c8831878d2
line wrap: on
line diff
--- a/libinterp/octave-value/ov-classdef.cc	Mon May 20 12:44:03 2013 -0400
+++ b/libinterp/octave-value/ov-classdef.cc	Mon May 20 14:37:25 2013 -0400
@@ -2731,6 +2731,32 @@
   return retval;
 }
 
+static octave_value_list
+package_getAllPackages (const octave_value_list& /* args */,
+                        int /* nargout */)
+{
+  std::map<std::string, cdef_package> toplevel_packages;
+
+  std::list<std::string> names = load_path::get_all_package_names ();
+
+  toplevel_packages["meta"] = cdef_manager::find_package ("meta", false,
+                                                          false);
+
+  for (std::list<std::string>::const_iterator it = names.begin ();
+       it != names.end (); ++it)
+    toplevel_packages[*it] = cdef_manager::find_package (*it, false, true);
+
+  Cell c (toplevel_packages.size (), 1);
+
+  int i = 0;
+
+  for (std::map<std::string, cdef_package>::const_iterator it = toplevel_packages.begin ();
+       it != toplevel_packages.end (); ++it)
+    c(i++,0) = to_ov (it->second);
+
+  return octave_value_list (octave_value (c));
+}
+
 void
 cdef_package::cdef_package_rep::install_class (const cdef_class& cls,
                                                const std::string& nm)
@@ -3018,6 +3044,8 @@
 		      "public", Matrix (), "private"));
   meta_package.install_method (make_method (meta_package, "fromName", package_fromName,
                                             "public", true));
+  meta_package.install_method (make_method (meta_package, "getAllPackages", package_getAllPackages,
+                                            "public", true));
 
   /* create "meta" package */
   cdef_package package_meta = cdef_package::_meta = make_package ("meta");