Store the file path when constructing MidiNameDocument
[ardour.git] / libs / midi++2 / midi++ / midnam_patch.h
index 9b2a611d9e82a76e0231594bba3fa16a01f90a0e..683f52f84d9f9c6b4ec9edda8a1aedd130423712 100644 (file)
@@ -21,6 +21,7 @@
 #define MIDNAM_PATCH_H_
 
 #include <algorithm>
+#include <cassert>
 #include <iostream>
 #include <string>
 #include <list>
@@ -43,46 +44,46 @@ namespace Name
 struct LIBMIDIPP_API PatchPrimaryKey
 {
 public:
-       int bank_number;
-       int program_number;
+       PatchPrimaryKey (int program_num = 0, int bank_num = 0)
+               : _bank(std::max(0, std::min(bank_num, 16383)))
+               , _program(std::max(0, std::min(program_num, 127)))
+       {}
 
-       PatchPrimaryKey (uint8_t a_program_number = 0, uint16_t a_bank_number = 0) {
-               bank_number = std::min (a_bank_number, (uint16_t) 16384);
-               program_number = std::min (a_program_number, (uint8_t) 127);
-       }
-       
-       bool is_sane() const {  
-               return ((bank_number >= 0) && (bank_number <= 16384) && 
-                       (program_number >=0 ) && (program_number <= 127));
-       }
-       
        inline PatchPrimaryKey& operator=(const PatchPrimaryKey& id) {
-               bank_number = id.bank_number;
-               program_number = id.program_number;
+               _bank    = id._bank;
+               _program = id._program;
                return *this;
        }
-       
+
        inline bool operator==(const PatchPrimaryKey& id) const {
-               return (bank_number == id.bank_number && program_number == id.program_number);
+               return (_bank    == id._bank &&
+                       _program == id._program);
        }
-       
-       /**
-        * obey strict weak ordering or crash in STL containers
-        */
+
+       /** Strict weak ordering. */
        inline bool operator<(const PatchPrimaryKey& id) const {
-               if (bank_number < id.bank_number) {
+               if (_bank < id._bank) {
                        return true;
-               } else if (bank_number == id.bank_number && program_number < id.program_number) {
+               } else if (_bank == id._bank && _program < id._program) {
                        return true;
                }
-               
                return false;
        }
+
+       void set_bank(int bank)       { _bank    = std::max(0, std::min(bank, 16383)); }
+       void set_program(int program) { _program = std::max(0, std::min(program, 127)); }
+
+       inline uint16_t bank()    const { return _bank; }
+       inline uint8_t  program() const { return _program; }
+
+private:
+       uint16_t _bank;
+       uint8_t  _program;
 };
 
 class PatchBank;
-       
-class LIBMIDIPP_API Patch 
+
+class LIBMIDIPP_API Patch
 {
 public:
 
@@ -91,14 +92,14 @@ public:
 
        const std::string& name() const        { return _name; }
        void set_name(const std::string& name) { _name = name; }
-       
+
        const std::string& note_list_name() const  { return _note_list_name; }
 
-       uint8_t program_number() const     { return _id.program_number; }
-       void set_program_number(uint8_t n) { _id.program_number = n; }
+       uint8_t program_number() const     { return _id.program(); }
+       void set_program_number(uint8_t n) { _id.set_program(n); }
 
-       uint16_t bank_number() const      { return _id.bank_number; }
-       void set_bank_number (uint16_t n) { _id.bank_number = n; }
+       uint16_t bank_number() const      { return _id.bank(); }
+       void set_bank_number (uint16_t n) { _id.set_bank(n); }
 
        const PatchPrimaryKey&   patch_primary_key()   const { return _id; }
 
@@ -113,7 +114,7 @@ private:
 
 typedef std::list<boost::shared_ptr<Patch> > PatchNameList;
 
-class LIBMIDIPP_API PatchBank 
+class LIBMIDIPP_API PatchBank
 {
 public:
        PatchBank (uint16_t n = 0, std::string a_name = std::string()) : _name(a_name), _number (n) {};
@@ -153,20 +154,18 @@ public:
 
        const std::string& name() const        { return _name; }
        void set_name(const std::string& name) { _name = name; }
-       
+
        const PatchBanks& patch_banks() const    { return _patch_banks; }
 
-       bool available_for_channel(uint8_t channel) const { 
-               return _available_for_channels.find(channel) != _available_for_channels.end(); 
+       bool available_for_channel(uint8_t channel) const {
+               return _available_for_channels.find(channel) != _available_for_channels.end();
        }
-       
+
        boost::shared_ptr<Patch> find_patch(const PatchPrimaryKey& key) {
-               assert(key.is_sane());
                return _patch_map[key];
        }
-       
+
        boost::shared_ptr<Patch> previous_patch(const PatchPrimaryKey& key) {
-               assert(key.is_sane());
                for (PatchList::const_iterator i = _patch_list.begin();
                         i != _patch_list.end();
                         ++i) {
@@ -174,15 +173,14 @@ public:
                                if (i != _patch_list.begin()) {
                                        --i;
                                        return  _patch_map[*i];
-                               } 
+                               }
                        }
                }
-                       
+
                return boost::shared_ptr<Patch>();
        }
-       
+
        boost::shared_ptr<Patch> next_patch(const PatchPrimaryKey& key) {
-               assert(key.is_sane());
                for (PatchList::const_iterator i = _patch_list.begin();
                         i != _patch_list.end();
                         ++i) {
@@ -194,7 +192,7 @@ public:
                                }
                        }
                }
-                       
+
                return boost::shared_ptr<Patch>();
        }
 
@@ -242,7 +240,7 @@ private:
        std::string _name;
 };
 
-class LIBMIDIPP_API NoteNameList 
+class LIBMIDIPP_API NoteNameList
 {
 public:
        typedef std::vector< boost::shared_ptr<Note> > Notes;
@@ -347,7 +345,7 @@ private:
        boost::shared_ptr<ValueNameList> _value_name_list;       ///< Local, ValueNameList
 };
 
-class LIBMIDIPP_API ControlNameList 
+class LIBMIDIPP_API ControlNameList
 {
 public:
        typedef std::map<uint16_t, boost::shared_ptr<Control> > Controls;
@@ -380,19 +378,19 @@ public:
        const std::string& name() const        { return _name; }
        void set_name(const std::string& name) { _name = name; }
 
-       
+
        XMLNode& get_state (void);
        int      set_state (const XMLTree&, const XMLNode&);
-       
+
        /// Note: channel here is 0-based while in the MIDNAM-file it's 1-based
        const std::string& channel_name_set_name_by_channel(uint8_t channel) {
                assert(channel <= 15);
-               return _channel_name_set_assignments[channel]; 
+               return _channel_name_set_assignments[channel];
        }
-       
+
 private:
        /// array index = channel number
-       /// string contents = name of channel name set 
+       /// string contents = name of channel name set
        std::string _name;
        std::string _channel_name_set_assignments[16];
 };
@@ -410,13 +408,13 @@ public:
        typedef std::map<std::string, boost::shared_ptr<ControlNameList> >  ControlNameLists;
        typedef std::map<std::string, boost::shared_ptr<ValueNameList> >    ValueNameLists;
        typedef std::map<std::string, PatchNameList>                        PatchNameLists;
-       
+
        MasterDeviceNames() {};
        virtual ~MasterDeviceNames() {};
-       
+
        const std::string& manufacturer() const { return _manufacturer; }
        void set_manufacturer(const std::string& manufacturer) { _manufacturer = manufacturer; }
-       
+
        const Models& models() const { return _models; }
        void set_models(const Models some_models) { _models = some_models; }
 
@@ -429,7 +427,7 @@ public:
                uint8_t            number);
 
        const CustomDeviceModeNames& custom_device_mode_names() const { return _custom_device_mode_names; }
-       
+
        boost::shared_ptr<CustomDeviceMode> custom_device_mode_by_name(const std::string& mode_name);
        boost::shared_ptr<ChannelNameSet> channel_name_set_by_channel(const std::string& mode, uint8_t channel);
        boost::shared_ptr<Patch> find_patch(const std::string& mode, uint8_t channel, const PatchPrimaryKey& key);
@@ -447,7 +445,7 @@ public:
 
        XMLNode& get_state (void);
        int      set_state (const XMLTree&, const XMLNode&);
-       
+
 private:
        std::string           _manufacturer;
        Models                _models;
@@ -465,27 +463,29 @@ class LIBMIDIPP_API MIDINameDocument
 public:
        // Maps Model names to MasterDeviceNames
        typedef std::map<std::string, boost::shared_ptr<MasterDeviceNames> > MasterDeviceNamesList;
-       
+
        MIDINameDocument() {}
-       MIDINameDocument(const std::string& filename);
+       MIDINameDocument(const std::string& file_path);
        virtual ~MIDINameDocument() {};
 
+       const std::string& file_path () const { return _file_path; }
+
        const std::string& author() const { return _author; }
        void set_author(const std::string& author) { _author = author; }
-       
+
        boost::shared_ptr<MasterDeviceNames> master_device_names(const std::string& model);
 
        const MasterDeviceNamesList& master_device_names_by_model() const { return _master_device_names_list; }
-       
+
        const MasterDeviceNames::Models& all_models() const { return _all_models; }
-               
+
        XMLNode& get_state (void);
        int      set_state (const XMLTree&, const XMLNode&);
 
 private:
+       const std::string             _file_path;
        std::string                   _author;
        MasterDeviceNamesList         _master_device_names_list;
-       XMLTree                       _document;
        MasterDeviceNames::Models     _all_models;
 };