# HG changeset patch # User Michael Goffioul # Date 1369075045 14400 # Node ID 1c45e22fc444f84f9154930a6375589427724a62 # Parent 04e1104388730653301d453a380907f4294e971b 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. diff --git a/libinterp/interpfcn/load-path.cc b/libinterp/interpfcn/load-path.cc --- a/libinterp/interpfcn/load-path.cc +++ b/libinterp/interpfcn/load-path.cc @@ -2103,6 +2103,21 @@ return retval; } +std::list +load_path::do_get_all_package_names (bool only_top_level) const +{ + std::list 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) diff --git a/libinterp/interpfcn/load-path.h b/libinterp/interpfcn/load-path.h --- a/libinterp/interpfcn/load-path.h +++ b/libinterp/interpfcn/load-path.h @@ -132,6 +132,14 @@ ? instance->do_find_package (package_name) : false; } + static std::list + get_all_package_names (bool only_top_level = true) + { + return instance_ok () + ? instance->do_get_all_package_names (only_top_level) + : std::list (); + } + 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 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; diff --git a/libinterp/octave-value/ov-classdef.cc b/libinterp/octave-value/ov-classdef.cc --- a/libinterp/octave-value/ov-classdef.cc +++ b/libinterp/octave-value/ov-classdef.cc @@ -2731,6 +2731,32 @@ return retval; } +static octave_value_list +package_getAllPackages (const octave_value_list& /* args */, + int /* nargout */) +{ + std::map toplevel_packages; + + std::list names = load_path::get_all_package_names (); + + toplevel_packages["meta"] = cdef_manager::find_package ("meta", false, + false); + + for (std::list::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::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");