Просмотр исходного кода

implemented MessageList::find() & ::contains()

Fabian Peter Hammerle 10 лет назад
Родитель
Сommit
ed828011a9
4 измененных файлов с 71 добавлено и 3 удалено
  1. 29 1
      MessageList.cpp
  2. 6 0
      MessageList.h
  3. 7 2
      tests/CMakeLists.txt
  4. 29 0
      tests/message-list-find.cpp

+ 29 - 1
MessageList.cpp

@@ -1,6 +1,34 @@
 #include "MessageList.h"
-#include <iostream>
 
 namespace midi {
+   
+bool MessageList::contains(const Message& message) const 
+{
+    return find(message) != end();
+}
+
+MessageList::const_iterator MessageList::find(const Message& message) const 
+{
+    for(const_iterator it = begin(); it != end(); it++) {
+        if(message == **it) {
+            return it;
+        }
+    }
+    return end();
+}
+    
+void MessageList::print(std::ostream& stream) const
+{
+    stream << "midi message list:\n";
+
+    unsigned int i = 0;
+    for(const_iterator msg_it = begin(); msg_it != end(); msg_it++, i++) {
+        stream << "#" << i << " ";
+        (*msg_it)->print(stream);
+    }
+
+    stream << "\n";
+    stream.flush();
+}
 
 }; // namespace

+ 6 - 0
MessageList.h

@@ -1,6 +1,7 @@
 #pragma once
 #include <list>
 #include <memory>
+#include <ostream>
 #include "Message.h"
 
 namespace midi {
@@ -8,6 +9,11 @@ namespace midi {
 class MessageList : public std::list<std::shared_ptr<Message>>
 {
     typedef std::list<std::shared_ptr<Message>> parent;
+
+public:
+    bool contains(const Message& message) const;
+    const_iterator find(const Message& message) const;
+    void print(std::ostream& stream) const;
 };
 
 } // namespace

+ 7 - 2
tests/CMakeLists.txt

@@ -7,8 +7,13 @@ link_directories("${CMAKE_SOURCE_DIR}/../lib")
 # add_definitions(-pthread)
 add_definitions(-std=c++11)
 
-add_executable(message-comparison message-comparison.cpp)
-target_link_libraries(message-comparison midi) 
+function(add_test name sources)
+        add_executable(${name} ${sources})
+        target_link_libraries(${name} midi)
+endfunction(add_test)
+
+add_test(message-comparison message-comparison.cpp)
+add_test(message-list-find message-list-find.cpp)
 
 add_executable(midiout midiout.cpp)
 target_link_libraries(midiout midi) 

+ 29 - 0
tests/message-list-find.cpp

@@ -0,0 +1,29 @@
+#include <memory>
+#include <iostream>
+#include "MessageList.h"
+
+using namespace midi;
+
+int main()
+{
+    MessageList l;
+    l.push_back(std::make_shared<NoteOnMessage>(1, 23, 43));
+    l.push_back(std::make_shared<NoteOnMessage>(1, 23, 43));
+    l.push_back(std::make_shared<NoteOnMessage>(2, 23, 43));
+    l.push_back(std::make_shared<NoteOffMessage>(1, 23, 43));
+    l.push_back(std::make_shared<NoteOffMessage>(1, 23, 43));
+
+    l.print(std::cout);
+
+    std::shared_ptr<Message> m = std::make_shared<NoteOffMessage>(1, 23, 43);
+    MessageList::const_iterator m_it = l.find(*m);
+    std::cout << "erase ";
+    (*m_it)->print(std::cout);
+    std::cout << "\n";
+    l.erase(m_it);
+
+    l.print(std::cout);
+
+    return 0;
+}
+