diff options
Diffstat (limited to 'liboffloadmic/runtime/offload_iterator.h')
-rw-r--r-- | liboffloadmic/runtime/offload_iterator.h | 103 |
1 files changed, 103 insertions, 0 deletions
diff --git a/liboffloadmic/runtime/offload_iterator.h b/liboffloadmic/runtime/offload_iterator.h new file mode 100644 index 0000000..f5922b4 --- /dev/null +++ b/liboffloadmic/runtime/offload_iterator.h @@ -0,0 +1,103 @@ +/* + Copyright (c) 2014-2015 Intel Corporation. All Rights Reserved. + + Redistribution and use in source and binary forms, with or without + modification, are permitted provided that the following conditions + are met: + + * Redistributions of source code must retain the above copyright + notice, this list of conditions and the following disclaimer. + * Redistributions in binary form must reproduce the above copyright + notice, this list of conditions and the following disclaimer in the + documentation and/or other materials provided with the distribution. + * Neither the name of Intel Corporation nor the names of its + contributors may be used to endorse or promote products derived + from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR + A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT + HOLDER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, + SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT + LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, + DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY + THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT + (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +*/ + + +/*! \file + \brief Iterator of Variable tables list used by the runtime library +*/ + +#ifndef OFFLOAD_ITERATOR_H_INCLUDED +#define OFFLOAD_ITERATOR_H_INCLUDED + +#include <iterator> +#include "offload_table.h" + +// The following class is for iteration over var table. +// It was extracted and moved to this offload_iterator.h file from offload_table.h +// to solve the problem with compiling with VS 2010. The problem was in incompatibility +// of STL objects in VS 2010 with ones in later VS versions. + +// var table list iterator +class Iterator : public std::iterator<std::input_iterator_tag, + VarTable::Entry> { + public: + Iterator() : m_node(0), m_entry(0) {} + + explicit Iterator(TableList<VarTable>::Node *node) { + new_node(node); + } + + Iterator& operator++() { + if (m_entry != 0) { + m_entry++; + while (m_entry->name == 0) { + m_entry++; + } + if (m_entry->name == reinterpret_cast<const char*>(-1)) { + new_node(m_node->next); + } + } + return *this; + } + + bool operator==(const Iterator &other) const { + return m_entry == other.m_entry; + } + + bool operator!=(const Iterator &other) const { + return m_entry != other.m_entry; + } + + const VarTable::Entry* operator*() const { + return m_entry; + } + + private: + void new_node(TableList<VarTable>::Node *node) { + m_node = node; + m_entry = 0; + while (m_node != 0) { + m_entry = m_node->table.entries; + while (m_entry->name == 0) { + m_entry++; + } + if (m_entry->name != reinterpret_cast<const char*>(-1)) { + break; + } + m_node = m_node->next; + m_entry = 0; + } + } + + private: + TableList<VarTable>::Node *m_node; + const VarTable::Entry *m_entry; +}; + +#endif // OFFLOAD_ITERATOR_H_INCLUDED |