changeset 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
files libinterp/interpfcn/load-path.cc libinterp/interpfcn/load-path.h libinterp/octave-value/ov-classdef.cc
diffstat 3 files changed, 53 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- a/libinterp/interpfcn/load-path.cc	Mon May 20 12:44:03 2013 -0400
+++ b/libinterp/interpfcn/load-path.cc	Mon May 20 14:37:25 2013 -0400
@@ -2103,6 +2103,21 @@
   return retval;
 }
 
+std::list<std::string>
+load_path::do_get_all_package_names (bool only_top_level) const
+{
+  std::list<std::string> retval;
+
+  for (const_loader_map_iterator l = loader_map.begin ();
+       l != loader_map.end (); ++l)
+    {
+      if (! only_top_level || l->first.find ('.') == std::string::npos)
+        retval.push_back (l->first);
+    }
+
+  return retval;
+}
+
 static void
 execute_pkg_add_or_del (const std::string& dir,
                         const std::string& script_file)
--- a/libinterp/interpfcn/load-path.h	Mon May 20 12:44:03 2013 -0400
+++ b/libinterp/interpfcn/load-path.h	Mon May 20 14:37:25 2013 -0400
@@ -132,6 +132,14 @@
       ? instance->do_find_package (package_name) : false;
   }
 
+  static std::list<std::string>
+  get_all_package_names (bool only_top_level = true)
+  {
+    return instance_ok ()
+      ? instance->do_get_all_package_names (only_top_level)
+      : std::list<std::string> ();
+  }
+
   static std::string find_fcn (const std::string& fcn, std::string& dir_name,
                                const std::string& pack_name = std::string ())
   {
@@ -671,6 +679,8 @@
     return (loader_map.find (package_name) != loader_map.end ());
   }
 
+  std::list<std::string> do_get_all_package_names (bool only_top_level) const;
+
   std::string do_find_file (const std::string& file) const;
 
   std::string do_find_dir (const std::string& dir) const;
--- 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");