Yığınak tomarları içindeki bellek sıralı erişimle kullanıldığından, bir nesneyi, nesne için ayrılan alanın sonuna bayt ya da baytlar ekleyerek adım adım oluşturmak mümkündür. Bu teknikle, bir nesneye veri aktarırken acaba yer kaldı mı diye düşünmeniz gerekmez. Bu tekniğe
Nesnelerin Büyütülmesi diyoruz. Bu bölümde nesneleri sonuna veri ekleyerek büyütmek için kullanılan özel işlevlere yer verilmiştir.
Bu işlevlerden birini kullanarak nesneye veri eklemek istediğinizde nesnenin büyütülmesi özdevinimli olarak gerçekleştiğinden, bir nesneyi büyütmeye başladığınızda özel olarak hiçbir şey yapmanız gerekmez. Ancak büyütme işlemi bittiğinde, bittiğinin belirtilmesi gerekir. Bunun için obstack_finish işlevi kullanılır.
Büyütme işleminin bittiği belirtilene kadar her veri eklemesinde nesne yeni bir tomara kopyalandığı için nesnenin büyütülmesi bitene kadar nesnenin gerçek adresi bilinmez.
Bir yığınak bir nesneyi büyütmek için kullanıldığında, bir başka nesneyi o yığına yerleştiremezsiniz. Bunu yapmayı denerseniz, eklediğiniz nesneye ayrı bir nesne olarak erişilemez; büyütülen nesneye bir alan eklenmiş olur ve eklediğiniz nesne büyütülen nesnenin bir parçası haline gelir.
void obstack_blank | (struct obstack *yığınak,
int boyut) |
işlev
Bir büyüyen nesneye alan oluşturmak için kullanılır. obstack_blank ilklendirilmemiş bir alan oluşturur.
void obstack_grow |
(struct obstack *yığınak,
void *veri,
int boyut) |
işlev
İlklendirilmiş bir blok eklemekte kullanılır. obstack_grow işlevi nesne büyüten bir obstack_copy işlevi gibi düşünülebilir. Büyüyen nesneye boyut uzunlukta veri ekler.
void obstack_grow0 | (struct obstack *yığınak,
void *veri,
int boyut) |
işlev
Nesne büyüten bir obstack_copy0 işlevi gibi düşünülenilir. Büyüyen nesneye boyut uzunlukta veri sonuna bir boş karakter getirilerek eklenir.
void obstack_1grow | (struct obstack *yığınak,
char c) |
işlev
obstack_1grow işlevi büyüyen nesneye bir defada sadece bir karakter eklemek için kullanılır. Büyüyen nesneye c karakterini içeren bir bayt ekler.
void obstack_ptr_grow | (struct obstack *yığınak,
void *veri) |
işlev
Bir oluşumun gösterici değerini büyüyen nesneye eklemek için kullanılır. Büyüyen nesneye veri’nin değerini içeren sizeof (void *) bayt ekler.
void obstack_int_grow | (struct obstack *yığınak,
int veri) |
işlev
Büyüyen nesneye int türünde tek bir değer eklemek için kullanılır. Büyüyen nesneye sizeof (int) bayt ekler ve veri'nin değeri ile ilklendirir.
void *obstack_finish | (struct obstack *yığınak) |
işlev
Bir büyüyen nesne ile işiniz bittiğinde onu kapatmak ve son adresini almak için bu işlevi kullanacaksınız.
Büyüyen bir nesneyi bitirdiğinizde, yığınak, normal nesne ayırma ya da yeni bir büyüyen nesne oluşturmak için kullanılabilir.
Bir büyüyen nesne ile çalışırken ne büyüklüğe ulaştığını bilmek isteyebilirsiniz. Bir büyüyen nesneyi bitirmeden obstack_object_size işlevini kullanarak yığınağın eriştiği boyutu öğrenebilirsiniz:
int obstack_object_size | (struct obstack *yığınak) |
işlev
Bu işlev, büyüyen nesnenin o andaki bayt cinsinden uzunluğu ile döner. Bu işlevin nesneyi bitirmeden çağrılabileceğini unutmayın. Nesneyi bitirdikten sonra obstack_object_size işlevi sıfır değeri ile döner.
Bir büyüyen nesne oluşturduktan sonra onu iptal etmek isterseniz, önce onu bitirin sonra da serbest bırakın. Örnek:
obstack_free (obstack_ptr, obstack_finish (obstack_ptr));
Nesne bir büyüyen nesne değilse bu etkisizdir.
Bir nesneyi küçültmek için
obstack_blank işlevini bir negatif boyutla çağırabilirsiniz. Ancak nesneyi küçültürken boyunun sıfırın altına inmemesine dikkat edin, aksi takdirde neler olacağı bilinemez.