aboutsummaryrefslogtreecommitdiff
path: root/cpp/src/sfntly/table/core
diff options
context:
space:
mode:
authorarthurhsu <arthurhsu@google.com>2011-10-11 01:01:16 +0000
committerarthurhsu <arthurhsu@google.com>2011-10-11 01:01:16 +0000
commit158cdcb9cf09418ba8b49f4be7be69e37aa8e9fa (patch)
treed45ec0d71e59ea8df58331b5005d6e920daedf3e /cpp/src/sfntly/table/core
parentb4e699e152543000a5825791e1c26826924a256f (diff)
downloadsfntly-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.cc61
-rw-r--r--cpp/src/sfntly/table/core/name_table.h14
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 {