50 typedef void (*hook_fcn_ptr) (
const std::string& dir);
52 OCTAVE_DISABLE_CONSTRUCT_COPY_MOVE (
load_path)
56 void initialize (
bool set_initial_path =
false);
60 void set (
const std::string& p,
bool warn =
false,
bool is_init =
false);
62 void append (
const std::string& dir,
bool warn =
false);
64 void prepend (
const std::string& dir,
bool warn =
false);
66 bool remove (
const std::string& dir);
70 bool contains_canonical (
const std::string& dir_name)
const;
72 bool contains_file_in_dir (
const std::string& file_name,
73 const std::string& dir_name);
76 const std::string& meth,
77 std::string& dir_name,
78 const std::string& pack_name =
"")
80 return get_package (pack_name).find_method (class_name, meth, dir_name);
84 const std::string& meth,
85 const std::string& pack_name =
"")
88 return find_method (class_name, meth, dir_name, pack_name);
91 std::list<std::string>
methods (
const std::string& class_name,
92 const std::string& pack_name =
"")
94 return get_package (pack_name).methods (class_name);
97 std::list<std::string> overloads (
const std::string& meth)
const;
101 return (m_package_map.find (package_name) != m_package_map.end ());
104 std::list<std::string>
105 get_all_package_names (
bool only_top_level =
true)
const;
107 std::string
find_fcn (
const std::string& fcn, std::string& dir_name,
108 const std::string& pack_name =
"")
110 return get_package (pack_name).find_fcn (fcn, dir_name);
114 const std::string& pack_name =
"")
116 std::string dir_name;
117 return find_fcn (fcn, dir_name, pack_name);
121 const std::string& fcn,
122 const std::string& pack_name =
"")
124 return get_package (pack_name).find_private_fcn (dir, fcn);
128 const std::string& pack_name =
"")
130 std::string dir_name;
131 return get_package (pack_name).find_fcn (fcn, dir_name, M_FILE);
135 const std::string& pack_name =
"")
137 std::string dir_name;
138 return get_package (pack_name).find_fcn (fcn, dir_name, M_FILE);
142 const std::string& pack_name =
"")
144 std::string dir_name;
145 return get_package (pack_name).find_fcn (fcn, dir_name, M_FILE);
148 std::string find_file (
const std::string& file)
const;
150 std::string find_dir (
const std::string& dir)
const;
152 string_vector find_matching_dirs (
const std::string& dir)
const;
154 std::string find_first_of (
const string_vector& files)
const;
160 std::list<std::string> dir_list ()
const;
162 string_vector files (
const std::string& dir,
bool omit_exts =
false)
const;
166 std::string path ()
const;
168 void display (std::ostream& os)
const;
177 return m_remove_hook;
190 void read_dir_config (
const std::string& dir)
const;
192 void execute_pkg_add (
const std::string& dir);
193 void execute_pkg_del (
const std::string& dir);
197 if (m_command_line_path.empty ())
198 m_command_line_path = p;
205 return m_command_line_path;
212 static const int M_FILE = 1;
213 static const int OCT_FILE = 2;
214 static const int MEX_FILE = 4;
223 typedef std::map<std::string, int> fcn_file_map_type;
225 typedef fcn_file_map_type::const_iterator const_fcn_file_map_iterator;
226 typedef fcn_file_map_type::iterator fcn_file_map_iterator;
234 : method_file_map (ci.method_file_map),
235 private_file_map (ci.private_file_map)
255 typedef std::map<std::string, class_info> method_file_map_type;
257 typedef method_file_map_type::const_iterator const_method_file_map_iterator;
258 typedef method_file_map_type::iterator method_file_map_iterator;
261 typedef std::map<std::string, dir_info> package_dir_map_type;
263 typedef package_dir_map_type::const_iterator const_package_dir_map_iterator;
264 typedef package_dir_map_type::iterator package_dir_map_iterator;
269 dir_info () =
default;
271 dir_info (
const std::string&
d)
272 : dir_name (
d), abs_dir_name (), is_relative (false),
273 dir_mtime (), dir_time_last_checked (), all_files (), fcn_files (),
274 private_file_map (), method_file_map (), package_dir_map ()
279 dir_info (
const dir_info&) =
default;
281 ~dir_info () =
default;
283 dir_info& operator = (
const dir_info&) =
default;
287 std::string dir_name;
288 std::string abs_dir_name;
290 sys::file_time dir_mtime;
291 sys::file_time dir_time_last_checked;
294 fcn_file_map_type private_file_map;
295 method_file_map_type method_file_map;
296 package_dir_map_type package_dir_map;
298 bool is_package (
const std::string& name)
const;
304 void get_file_list (
const std::string&
d);
306 void get_private_file_map (
const std::string&
d);
308 void get_method_file_map (
const std::string&
d,
309 const std::string& class_name);
311 void get_package_dir (
const std::string&
d,
312 const std::string& package_name);
323 file_info (
const std::string&
d,
int t) : dir_name (
d), types (t) { }
326 : dir_name (fi.dir_name), types (fi.types) { }
334 dir_name = fi.dir_name;
341 std::string dir_name;
358 typedef std::list<dir_info> dir_info_list_type;
360 typedef dir_info_list_type::const_iterator const_dir_info_list_iterator;
361 typedef dir_info_list_type::iterator dir_info_list_iterator;
363 typedef std::map<std::string, dir_info> abs_dir_cache_type;
365 typedef abs_dir_cache_type::const_iterator const_abs_dir_cache_iterator;
366 typedef abs_dir_cache_type::iterator abs_dir_cache_iterator;
368 typedef std::list<file_info> file_info_list_type;
370 typedef file_info_list_type::const_iterator const_file_info_list_iterator;
371 typedef file_info_list_type::iterator file_info_list_iterator;
374 typedef std::map<std::string, file_info_list_type> fcn_map_type;
376 typedef fcn_map_type::const_iterator const_fcn_map_iterator;
377 typedef fcn_map_type::iterator fcn_map_iterator;
380 typedef std::map<std::string, dir_info::fcn_file_map_type>
381 private_fcn_map_type;
383 typedef private_fcn_map_type::const_iterator const_private_fcn_map_iterator;
384 typedef private_fcn_map_type::iterator private_fcn_map_iterator;
387 typedef std::map<std::string, fcn_map_type> method_map_type;
389 typedef method_map_type::const_iterator const_method_map_iterator;
390 typedef method_map_type::iterator method_map_iterator;
396 package_info (
const std::string& package_name =
"")
397 : m_package_name (package_name), m_dir_list (), m_fcn_map (),
398 m_private_fcn_map (),
402 package_info (
const package_info& l)
403 : m_package_name (l.m_package_name), m_dir_list (l.m_dir_list),
404 m_private_fcn_map (l.m_private_fcn_map), m_method_map (l.m_method_map)
407 ~package_info () =
default;
409 package_info& operator = (
const package_info& l)
413 m_package_name = l.m_package_name;
414 m_dir_list = l.m_dir_list;
415 m_fcn_map = l.m_fcn_map;
416 m_private_fcn_map = l.m_private_fcn_map;
417 m_method_map = l.m_method_map;
423 void add (
const dir_info& di,
bool at_end,
bool updating)
426 m_dir_list.push_back (di.dir_name);
428 m_dir_list.push_front (di.dir_name);
430 add_to_fcn_map (di, at_end, updating);
432 add_to_private_fcn_map (di);
434 add_to_method_map (di, at_end);
437 void move (
const dir_info& di,
bool at_end);
439 void remove (
const dir_info& di);
447 m_private_fcn_map.clear ();
449 m_method_map.clear ();
452 void display (std::ostream& out)
const;
455 find_fcn (
const std::string& fcn, std::string& dir_name,
456 int type = M_FILE | OCT_FILE | MEX_FILE)
const;
459 find_private_fcn (
const std::string& dir,
const std::string& fcn,
460 int type = M_FILE | OCT_FILE | MEX_FILE)
const;
463 find_method (
const std::string& class_name,
const std::string& meth,
464 std::string& dir_name,
465 int type = M_FILE | OCT_FILE | MEX_FILE)
const;
467 std::list<std::string> methods (
const std::string& class_name)
const;
469 void overloads (
const std::string& meth, std::list<std::string>& l)
const;
475 void add_to_fcn_map (
const dir_info& di,
bool at_end,
bool updating);
477 void add_to_private_fcn_map (
const dir_info& di);
479 void add_to_method_map (
const dir_info& di,
bool at_end);
481 void move_fcn_map (
const std::string& dir,
484 void move_method_map (
const std::string& dir,
bool at_end);
486 void remove_fcn_map (
const std::string& dir,
489 void remove_private_fcn_map (
const std::string& dir);
491 void remove_method_map (
const std::string& dir);
493 bool check_file_type (std::string& fname,
int type,
int possible_types,
494 const std::string& fcn,
const char *who)
const;
496 void print_types (std::ostream& os,
int types)
const;
498 void print_fcn_list (std::ostream& os,
499 const dir_info::fcn_file_map_type& lst)
const;
501 std::string m_package_name;
503 std::list<std::string> m_dir_list;
505 fcn_map_type m_fcn_map;
507 private_fcn_map_type m_private_fcn_map;
509 method_map_type m_method_map;
513 typedef std::map<std::string, package_info> package_map_type;
515 typedef package_map_type::const_iterator const_package_map_iterator;
516 typedef package_map_type::iterator package_map_iterator;
518 std::function<void (
const std::string&)> m_add_hook;
520 std::function<void (
const std::string&)> m_remove_hook;
522 void execute_pkg_add_or_del (
const std::string& dir,
523 const std::string& script_file);
525 const_dir_info_list_iterator find_dir_info (
const std::string& dir)
const;
526 dir_info_list_iterator find_dir_info (
const std::string& dir);
528 bool contains (
const std::string& dir)
const;
530 void move (dir_info_list_iterator i,
bool at_end);
532 void move (
const dir_info& di,
bool at_end,
const std::string& pname =
"");
534 void remove (
const dir_info& di,
const std::string& pname =
"");
536 void add (
const std::string& dir,
bool at_end,
bool warn);
538 void add (
const dir_info& di,
bool at_end,
const std::string& pname =
"",
539 bool updating =
false);
541 bool is_package (
const std::string& name)
const;
543 package_info& get_package (
const std::string& name)
545 if (! name.empty () && is_package (name))
547 package_map_iterator l = m_package_map.find (name);
549 if (l == m_package_map.end ())
550 l = m_package_map.insert (m_package_map.end (),
551 package_map_type::value_type (name, package_info (name)));
556 return m_top_level_package;
559 string_vector get_file_list (
const dir_info::fcn_file_map_type& lst)
const;
561 std::string find_private_file (
const std::string& fname)
const;
563 friend dir_info::fcn_file_map_type
get_fcn_files (
const std::string&
d);
567 static std::string s_sys_path;
569 static abs_dir_cache_type s_abs_dir_cache;
573 package_map_type m_package_map;
575 package_info m_top_level_package;
577 dir_info_list_type m_dir_info_list;
579 std::set<std::string> m_init_dirs;
581 std::string m_command_line_path;