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;
211 s_sys_path = sys_path;
217 static const int M_FILE = 1;
218 static const int OCT_FILE = 2;
219 static const int MEX_FILE = 4;
228 typedef std::map<std::string, int> fcn_file_map_type;
230 typedef fcn_file_map_type::const_iterator const_fcn_file_map_iterator;
231 typedef fcn_file_map_type::iterator fcn_file_map_iterator;
236 class_info () : m_method_file_map (), m_private_file_map () { }
239 : m_method_file_map (ci.m_method_file_map),
240 m_private_file_map (ci.m_private_file_map)
260 typedef std::map<std::string, class_info> method_file_map_type;
262 typedef method_file_map_type::const_iterator const_method_file_map_iterator;
263 typedef method_file_map_type::iterator method_file_map_iterator;
266 typedef std::map<std::string, dir_info> package_dir_map_type;
268 typedef package_dir_map_type::const_iterator const_package_dir_map_iterator;
269 typedef package_dir_map_type::iterator package_dir_map_iterator;
274 dir_info () =
default;
276 dir_info (
const std::string&
d)
277 : m_dir_name (
d), m_abs_dir_name (), m_is_relative (false),
278 m_dir_mtime (), m_dir_time_last_checked (), m_all_files (),
279 m_fcn_files (), m_private_file_map (), m_method_file_map (),
285 dir_info (
const dir_info&) =
default;
287 ~dir_info () =
default;
289 dir_info& operator = (
const dir_info&) =
default;
293 bool is_package (
const std::string& name)
const;
297 std::string m_dir_name;
298 std::string m_abs_dir_name;
300 sys::file_time m_dir_mtime;
301 sys::file_time m_dir_time_last_checked;
304 fcn_file_map_type m_private_file_map;
305 method_file_map_type m_method_file_map;
306 package_dir_map_type m_package_dir_map;
312 void get_file_list (
const std::string&
d);
314 void get_private_file_map (
const std::string&
d);
316 void get_method_file_map (
const std::string&
d,
317 const std::string& class_name);
319 void get_package_dir (
const std::string&
d,
320 const std::string& package_name);
331 file_info (
const std::string&
d,
int t) : m_dir_name (
d), m_types (t) { }
334 : m_dir_name (fi.m_dir_name), m_types (fi.m_types) { }
342 m_dir_name = fi.m_dir_name;
343 m_types = fi.m_types;
351 std::string m_dir_name;
368 typedef std::list<dir_info> dir_info_list_type;
370 typedef dir_info_list_type::const_iterator const_dir_info_list_iterator;
371 typedef dir_info_list_type::iterator dir_info_list_iterator;
373 typedef std::map<std::string, dir_info> abs_dir_cache_type;
375 typedef abs_dir_cache_type::const_iterator const_abs_dir_cache_iterator;
376 typedef abs_dir_cache_type::iterator abs_dir_cache_iterator;
378 typedef std::list<file_info> file_info_list_type;
380 typedef file_info_list_type::const_iterator const_file_info_list_iterator;
381 typedef file_info_list_type::iterator file_info_list_iterator;
384 typedef std::map<std::string, file_info_list_type> fcn_map_type;
386 typedef fcn_map_type::const_iterator const_fcn_map_iterator;
387 typedef fcn_map_type::iterator fcn_map_iterator;
390 typedef std::map<std::string, dir_info::fcn_file_map_type>
391 private_fcn_map_type;
393 typedef private_fcn_map_type::const_iterator const_private_fcn_map_iterator;
394 typedef private_fcn_map_type::iterator private_fcn_map_iterator;
397 typedef std::map<std::string, fcn_map_type> method_map_type;
399 typedef method_map_type::const_iterator const_method_map_iterator;
400 typedef method_map_type::iterator method_map_iterator;
406 package_info (
const std::string& package_name =
"")
407 : m_package_name (package_name), m_dir_list (), m_fcn_map (),
408 m_private_fcn_map (), m_method_map ()
411 package_info (
const package_info& l)
412 : m_package_name (l.m_package_name), m_dir_list (l.m_dir_list),
413 m_private_fcn_map (l.m_private_fcn_map), m_method_map (l.m_method_map)
416 ~package_info () =
default;
418 package_info& operator = (
const package_info& l)
422 m_package_name = l.m_package_name;
423 m_dir_list = l.m_dir_list;
424 m_fcn_map = l.m_fcn_map;
425 m_private_fcn_map = l.m_private_fcn_map;
426 m_method_map = l.m_method_map;
432 void add (
const dir_info& di,
bool at_end,
bool updating)
435 m_dir_list.push_back (di.m_dir_name);
437 m_dir_list.push_front (di.m_dir_name);
439 add_to_fcn_map (di, at_end, updating);
441 add_to_private_fcn_map (di);
443 add_to_method_map (di, at_end);
446 void move (
const dir_info& di,
bool at_end);
448 void remove (
const dir_info& di);
456 m_private_fcn_map.clear ();
458 m_method_map.clear ();
461 void display (std::ostream& out)
const;
464 find_fcn (
const std::string& fcn, std::string& dir_name,
465 int type = M_FILE | OCT_FILE | MEX_FILE)
const;
468 find_private_fcn (
const std::string& dir,
const std::string& fcn,
469 int type = M_FILE | OCT_FILE | MEX_FILE)
const;
472 find_method (
const std::string& class_name,
const std::string& meth,
473 std::string& dir_name,
474 int type = M_FILE | OCT_FILE | MEX_FILE)
const;
476 std::list<std::string> methods (
const std::string& class_name)
const;
478 void overloads (
const std::string& meth, std::list<std::string>& l)
const;
484 void add_to_fcn_map (
const dir_info& di,
bool at_end,
bool updating);
486 void add_to_private_fcn_map (
const dir_info& di);
488 void add_to_method_map (
const dir_info& di,
bool at_end);
490 void move_fcn_map (
const std::string& dir,
493 void move_method_map (
const std::string& dir,
bool at_end);
495 void remove_fcn_map (
const std::string& dir,
498 void remove_private_fcn_map (
const std::string& dir);
500 void remove_method_map (
const std::string& dir);
502 bool check_file_type (std::string& fname,
int type,
int possible_types,
503 const std::string& fcn,
const char *who)
const;
505 void print_types (std::ostream& os,
int types)
const;
507 void print_fcn_list (std::ostream& os,
508 const dir_info::fcn_file_map_type& lst)
const;
512 std::string m_package_name;
514 std::list<std::string> m_dir_list;
516 fcn_map_type m_fcn_map;
518 private_fcn_map_type m_private_fcn_map;
520 method_map_type m_method_map;
524 typedef std::map<std::string, package_info> package_map_type;
526 typedef package_map_type::const_iterator const_package_map_iterator;
527 typedef package_map_type::iterator package_map_iterator;
529 std::function<void (
const std::string&)> m_add_hook;
531 std::function<void (
const std::string&)> m_remove_hook;
533 void execute_pkg_add_or_del (
const std::string& dir,
534 const std::string& script_file);
536 const_dir_info_list_iterator find_dir_info (
const std::string& dir)
const;
537 dir_info_list_iterator find_dir_info (
const std::string& dir);
539 bool contains (
const std::string& dir)
const;
541 void move (dir_info_list_iterator i,
bool at_end);
543 void move (
const dir_info& di,
bool at_end,
const std::string& pname =
"");
545 void remove (
const dir_info& di,
const std::string& pname =
"");
547 void add (
const std::string& dir,
bool at_end,
bool warn);
549 void add (
const dir_info& di,
bool at_end,
const std::string& pname =
"",
550 bool updating =
false);
552 bool is_package (
const std::string& name)
const;
554 package_info& get_package (
const std::string& name)
556 if (! name.empty () && is_package (name))
558 package_map_iterator l = m_package_map.find (name);
560 if (l == m_package_map.end ())
561 l = m_package_map.insert (m_package_map.end (),
562 package_map_type::value_type (name, package_info (name)));
567 return m_top_level_package;
570 string_vector get_file_list (
const dir_info::fcn_file_map_type& lst)
const;
572 std::string find_private_file (
const std::string& fname)
const;
574 friend dir_info::fcn_file_map_type
get_fcn_files (
const std::string&
d);
578 static std::string s_sys_path;
580 static abs_dir_cache_type s_abs_dir_cache;
584 package_map_type m_package_map;
586 package_info m_top_level_package;
588 dir_info_list_type m_dir_info_list;
590 std::set<std::string> m_init_dirs;
592 std::string m_command_line_path;