+Pointer *Pointer::Copy(CYPool &pool, const char *rename) const {
+ return new(pool) Pointer(*type.Copy(pool));
+}
+
+Array *Array::Copy(CYPool &pool, const char *rename) const {
+ return new(pool) Array(*type.Copy(pool), size);
+}
+
+#ifdef CY_OBJECTIVEC
+Object *Object::Copy(CYPool &pool, const char *rename) const {
+ return new(pool) Object(pool.strdup(name));
+}
+#endif
+
+Aggregate *Aggregate::Copy(CYPool &pool, const char *rename) const {
+ if (rename == NULL)
+ rename = pool.strdup(name);
+ else if (rename[0] == '\0')
+ rename = NULL;
+ Aggregate *copy(new(pool) Aggregate(overlap, rename));
+ sig::Copy(pool, copy->signature, signature);
+ return copy;
+}
+
+Function *Function::Copy(CYPool &pool, const char *rename) const {
+ Function *copy(new(pool) Function(variadic));
+ sig::Copy(pool, copy->signature, signature);
+ return copy;
+}
+
+#ifdef CY_OBJECTIVEC
+Block *Block::Copy(CYPool &pool, const char *rename) const {
+ Block *copy(new(pool) Block());
+ sig::Copy(pool, copy->signature, signature);
+ return copy;
+}
+#endif
+