diff options
author | arthurhsu <arthurhsu@google.com> | 2011-10-11 01:01:16 +0000 |
---|---|---|
committer | arthurhsu <arthurhsu@google.com> | 2011-10-11 01:01:16 +0000 |
commit | 158cdcb9cf09418ba8b49f4be7be69e37aa8e9fa (patch) | |
tree | d45ec0d71e59ea8df58331b5005d6e920daedf3e /cpp/src/sfntly/table/core | |
parent | b4e699e152543000a5825791e1c26826924a256f (diff) | |
download | sfntly-158cdcb9cf09418ba8b49f4be7be69e37aa8e9fa.tar.gz |
Update to Sep 30 snapshot, include all current EBXX support.
Refine Iterator ports: all java-style Iterator objects are ref-counted and have automatic memory management now.
Diffstat (limited to 'cpp/src/sfntly/table/core')
-rw-r--r-- | cpp/src/sfntly/table/core/name_table.cc | 61 | ||||
-rw-r--r-- | cpp/src/sfntly/table/core/name_table.h | 14 |
2 files changed, 32 insertions, 43 deletions
diff --git a/cpp/src/sfntly/table/core/name_table.cc b/cpp/src/sfntly/table/core/name_table.cc index 9853130..5f6d5a5 100644 --- a/cpp/src/sfntly/table/core/name_table.cc +++ b/cpp/src/sfntly/table/core/name_table.cc @@ -227,27 +227,31 @@ bool NameTable::NameEntryFilterInPlace::Accept(int32_t platform_id, /****************************************************************************** * NameTable::NameEntryIterator class ******************************************************************************/ -NameTable::NameEntryIterator::NameEntryIterator(NameTable* table) { - Init(table, NULL); +NameTable::NameEntryIterator::NameEntryIterator(NameTable* table) + : RefIterator<NameEntry, NameTable>(table), + name_index_(0), + filter_(NULL) { } NameTable::NameEntryIterator::NameEntryIterator(NameTable* table, - NameEntryFilter* filter) { - Init(table, filter); + NameEntryFilter* filter) + : RefIterator<NameEntry, NameTable>(table), + name_index_(0), + filter_(filter) { } bool NameTable::NameEntryIterator::HasNext() { if (!filter_) { - if (name_index_ < table_->NameCount()) { + if (name_index_ < container()->NameCount()) { return true; } return false; } - for (; name_index_ < table_->NameCount(); ++name_index_) { - if (filter_->Accept(table_->PlatformId(name_index_), - table_->EncodingId(name_index_), - table_->LanguageId(name_index_), - table_->NameId(name_index_))) { + for (; name_index_ < container()->NameCount(); ++name_index_) { + if (filter_->Accept(container()->PlatformId(name_index_), + container()->EncodingId(name_index_), + container()->LanguageId(name_index_), + container()->NameId(name_index_))) { return true; } } @@ -257,21 +261,7 @@ bool NameTable::NameEntryIterator::HasNext() { CALLER_ATTACH NameTable::NameEntry* NameTable::NameEntryIterator::Next() { if (!HasNext()) return NULL; - return table_->GetNameEntry(name_index_++); -} - -void NameTable::NameEntryIterator::Remove() { -#if !defined (SFNTLY_NO_EXCEPTION) - throw UnsupportedOperationException( - "Cannot remove a name table from an existing font."); -#endif -} - -void NameTable::NameEntryIterator::Init(NameTable* table, - NameEntryFilter* filter) { - table_ = table; - filter_ = filter; - name_index_ = 0; + return container()->GetNameEntry(name_index_++); } /****************************************************************************** @@ -423,10 +413,11 @@ int32_t NameTable::Builder::SubSerialize(WritableFontData* new_data) { void NameTable::Builder::Initialize(ReadableFontData* data) { if (data) { NameTablePtr table = new NameTable(header(), data); - NameEntryIterator name_iter(table, NULL); - while (name_iter.HasNext()) { + Ptr<NameEntryIterator> name_iter; + name_iter.Attach(table->Iterator()); + while (name_iter->HasNext()) { NameEntryPtr name_entry; - name_entry.Attach(name_iter.Next()); + name_entry.Attach(name_iter->Next()); NameEntryBuilderPtr name_entry_builder = new NameEntryBuilder(name_entry); NameEntry* builder_entry = name_entry_builder->name_entry(); NameEntryId probe = builder_entry->name_entry_id(); @@ -532,21 +523,25 @@ CALLER_ATTACH NameTable::NameEntry* NameTable::GetNameEntry(int32_t platform_id, int32_t name_id) { NameTable::NameEntryFilterInPlace filter(platform_id, encoding_id, language_id, name_id); - NameTable::NameEntryIterator* name_entry_iter = Iterator(&filter); + Ptr<NameTable::NameEntryIterator> name_entry_iter; + name_entry_iter.Attach(Iterator(&filter)); NameEntryPtr result; if (name_entry_iter->HasNext()) { result = name_entry_iter->Next(); } - delete name_entry_iter; return result; } -NameTable::NameEntryIterator* NameTable::Iterator() { - return new NameTable::NameEntryIterator(this); +CALLER_ATTACH NameTable::NameEntryIterator* NameTable::Iterator() { + Ptr<NameEntryIterator> output = new NameTable::NameEntryIterator(this); + return output.Detach(); } +CALLER_ATTACH NameTable::NameEntryIterator* NameTable::Iterator(NameEntryFilter* filter) { - return new NameTable::NameEntryIterator(this, filter); + Ptr<NameEntryIterator> output = + new NameTable::NameEntryIterator(this, filter); + return output.Detach(); } NameTable::NameTable(Header* header, ReadableFontData* data) diff --git a/cpp/src/sfntly/table/core/name_table.h b/cpp/src/sfntly/table/core/name_table.h index 0c657da..9c007a1 100644 --- a/cpp/src/sfntly/table/core/name_table.h +++ b/cpp/src/sfntly/table/core/name_table.h @@ -26,6 +26,7 @@ #include <map> #include <utility> +#include "sfntly/port/java_iterator.h" #include "sfntly/table/subtable_container_table.h" #if defined U_USING_ICU_NAMESPACE @@ -555,23 +556,17 @@ class NameTable : public SubTableContainerTable, public RefCounted<NameTable> { int32_t name_id_; }; - // Mimic Java's iterator to iterate through the entries within the name table. - class NameEntryIterator { + class NameEntryIterator : public RefIterator<NameEntry, NameTable> { public: // If filter is NULL, filter through all tables. explicit NameEntryIterator(NameTable* table); NameEntryIterator(NameTable* table, NameEntryFilter* filter); - // Make gcc -Wnon-virtual-dtor happy. virtual ~NameEntryIterator() {} virtual bool HasNext(); virtual CALLER_ATTACH NameEntry* Next(); - virtual void Remove(); private: - void Init(NameTable* table, NameEntryFilter* filter); - - NameTable* table_; // Use dumb pointer since it's a composition object. int32_t name_index_; NameEntryFilter* filter_; }; @@ -686,9 +681,8 @@ class NameTable : public SubTableContainerTable, public RefCounted<NameTable> { // virtual void names(std::set<NameEntryPtr>*); // Get the iterator to iterate through all name entries. - // Note: Caller delete the returned object. - virtual NameEntryIterator* Iterator(); - virtual NameEntryIterator* Iterator(NameEntryFilter* filter); + virtual CALLER_ATTACH NameEntryIterator* Iterator(); + virtual CALLER_ATTACH NameEntryIterator* Iterator(NameEntryFilter* filter); private: struct Offset { |