| #ifndef RUST_CRATE_MAP_H |
| #define RUST_CRATE_MAP_H |
| |
| #include "rust_log.h" |
| #include <stdint.h> |
| |
| struct mod_entry { |
| const char* name; |
| uint32_t* state; |
| }; |
| |
| class cratemap; |
| |
| class cratemap_v0 { |
| friend class cratemap; |
| const mod_entry *m_entries; |
| const cratemap* m_children[1]; |
| }; |
| |
| class cratemap { |
| private: |
| int32_t m_version; |
| const void *m_annihilate_fn; |
| const mod_entry* m_entries; |
| const cratemap* m_children[1]; |
| |
| inline int32_t version() const { |
| switch (m_version) { |
| case 1: return 1; |
| default: return 0; |
| } |
| } |
| |
| public: |
| typedef const cratemap *const *iterator; |
| |
| inline const void *annihilate_fn() const { |
| switch (version()) { |
| case 0: return NULL; |
| case 1: return m_annihilate_fn; |
| default: assert(false && "Unknown crate map version!"); |
| } |
| } |
| |
| inline const mod_entry *entries() const { |
| switch (version()) { |
| case 0: return reinterpret_cast<const cratemap_v0 *>(this)->m_entries; |
| case 1: return m_entries; |
| default: assert(false && "Unknown crate map version!"); |
| } |
| } |
| |
| inline const iterator begin() const { |
| switch (version()) { |
| case 0: |
| return &reinterpret_cast<const cratemap_v0 *>(this)-> |
| m_children[0]; |
| case 1: |
| return &m_children[1]; |
| default: assert(false && "Unknown crate map version!"); |
| } |
| } |
| |
| inline const iterator end() const { |
| iterator i = begin(); |
| while (*i) |
| i++; |
| return i; |
| } |
| }; |
| |
| void iter_module_map(const mod_entry* map, |
| void (*fn)(const mod_entry* entry, void *cookie), |
| void *cookie); |
| |
| void iter_crate_map(const cratemap* map, |
| void (*fn)(const mod_entry* entry, void *cookie), |
| void *cookie); |
| |
| // |
| // Local Variables: |
| // mode: C++ |
| // fill-column: 78; |
| // indent-tabs-mode: nil |
| // c-basic-offset: 4 |
| // buffer-file-coding-system: utf-8-unix |
| // End: |
| // |
| |
| #endif /* RUST_CRATE_MAP_H */ |