#ifndef WRITEUSER #define WRITEUSER /**************************************************************************/ /* File: writeuser.hh */ /* Authors: many */ /* Date: 10. Dec. 97 */ /**************************************************************************/ #include #include #include #include namespace netgen { using namespace std::filesystem; typedef std::function FWrite; typedef std::function FRead; typedef std::function FTest; struct UserFormatRegister { struct UserFormatEntry { string format; Array extensions; optional read; optional write; }; DLL_HEADER static Array entries; DLL_HEADER static std::map format_to_entry_index; static void Register(UserFormatEntry && entry) { format_to_entry_index[entry.format] = entries.Size(); entries.Append( std::move(entry) ); } static const bool HaveFormat(string format) { return format_to_entry_index.count(format) > 0; } static const UserFormatEntry & Get(string format) { return entries[format_to_entry_index[format]]; } template static void IterateFormats(TFunc func, bool need_read=false, bool need_write=false) { Array import_formats; for(const auto & e: entries) if((!need_read || e.read) && (!need_write || e.write)) import_formats.Append(e.format); QuickSort(import_formats); for(auto format : import_formats) func(entries[format_to_entry_index[format]]); } }; struct RegisterUserFormat { RegisterUserFormat(string format, Array extensions, optional read, optional write, FTest ftest = [](const filesystem::path & ){return true;}) { UserFormatRegister::Register({format, std::move(extensions), std::move(read), std::move(write)}); } }; DLL_HEADER void ReadFile(Mesh & mesh, const filesystem::path & filename); DLL_HEADER void ReadUserFormat(Mesh & mesh, const filesystem::path & filename, const string & format = ""); extern bool DLL_HEADER WriteUserFormat (const string & format, const Mesh & mesh, const filesystem::path & filename); extern void DLL_HEADER RegisterUserFormats (NgArray & names, NgArray & extensions); } #endif