text: #include "../../common.h"
  
  #include "../parameters.h"
  #include "../arginfo.h"
  
  #include "../iterators/php_queue_iterator.h"
  #include "../handlers/php_queue_handlers.h"
  #include "../objects/php_queue.h"
  
  #include "php_collection_ce.h"
  #include "php_queue_ce.h"
  
  #define METHOD(name) PHP_METHOD(Queue, name)
  
  zend_class_entry *php_ds_queue_ce;
  
  METHOD(__construct)
  {
      PARSE_OPTIONAL_ZVAL(values);
  
      if (values) {
          ds_queue_push_all(THIS_DS_QUEUE(), values);
      }
  }
  
  METHOD(allocate)
  {
      PARSE_LONG(capacity);
      ds_queue_allocate(THIS_DS_QUEUE(), capacity);
  }
  
  METHOD(capacity)
  {
      PARSE_NONE;
      RETURN_LONG(ds_queue_capacity(THIS_DS_QUEUE()));
  }
  
  METHOD(push)
  {
      PARSE_VARIADIC_ZVAL();
      ds_queue_push(THIS_DS_QUEUE(), argc, argv);
  }
  
  METHOD(pop)
  {
      PARSE_NONE;
      ds_queue_pop_throw(THIS_DS_QUEUE(), return_value);
  }
  
  METHOD(peek)
  {
      PARSE_NONE;
      RETURN_ZVAL_COPY(ds_queue_peek_throw(THIS_DS_QUEUE()));
  }
  
  METHOD(copy)
  {
      PARSE_NONE;
      RETURN_OBJ(php_ds_queue_create_clone(THIS_DS_QUEUE()));
  }
  
  METHOD(count)
  {
      PARSE_NONE;
      RETURN_LONG(QUEUE_SIZE(THIS_DS_QUEUE()));
  }
  
  METHOD(clear)
  {
      PARSE_NONE;
      ds_queue_clear(THIS_DS_QUEUE());
  }
  
  METHOD(toArray)
  {
      PARSE_NONE;
      ds_queue_to_array(THIS_DS_QUEUE(), return_value);
  }
  
  METHOD(isEmpty)
  {
      PARSE_NONE;
      RETURN_BOOL(QUEUE_SIZE(THIS_DS_QUEUE()) == 0);
  }
  
  METHOD(jsonSerialize)
  {
      PARSE_NONE;
      ds_queue_to_array(THIS_DS_QUEUE(), return_value);
  }
  
  METHOD(getIterator) {
      PARSE_NONE;
      ZVAL_COPY(return_value, getThis());
  }
  
  METHOD(offsetExists)
  {
      ARRAY_ACCESS_BY_KEY_NOT_SUPPORTED();
  }
  
  METHOD(offsetGet)
  {
      ARRAY_ACCESS_BY_KEY_NOT_SUPPORTED();
  }
  
  METHOD(offsetSet)
  {
      PARSE_ZVAL_ZVAL(offset, value);
  
      if (Z_TYPE_P(offset) == IS_NULL) {
          ds_queue_push(THIS_DS_QUEUE(), 1, value);
      } else {
          ARRAY_ACCESS_BY_KEY_NOT_SUPPORTED();
      }
  }
  
  METHOD(offsetUnset)
  {
      ARRAY_ACCESS_BY_KEY_NOT_SUPPORTED();
  }
  
  void php_ds_register_queue()
  {
      zend_class_entry ce;
  
      zend_function_entry methods[] = {
          PHP_DS_ME(Queue, __construct)
          PHP_DS_ME(Queue, allocate)
          PHP_DS_ME(Queue, capacity)
          PHP_DS_ME(Queue, peek)
          PHP_DS_ME(Queue, pop)
          PHP_DS_ME(Queue, push)
          PHP_DS_ME(Queue, getIterator)
  
          PHP_DS_ME(Queue, offsetExists)
          PHP_DS_ME(Queue, offsetGet) 
          PHP_DS_ME(Queue, offsetSet) 
          PHP_DS_ME(Queue, offsetUnset)
  
          PHP_DS_COLLECTION_ME_LIST(Queue)
          PHP_FE_END
      };
  
      INIT_CLASS_ENTRY(ce, PHP_DS_NS(Queue), methods);
  
      php_ds_queue_ce = zend_register_internal_class(&ce);
      php_ds_queue_ce->ce_flags      |= ZEND_ACC_FINAL;
      php_ds_queue_ce->create_object  = php_ds_queue_create_object;
      php_ds_queue_ce->get_iterator   = php_ds_queue_get_iterator;
      php_ds_queue_ce->serialize      = php_ds_queue_serialize;
      php_ds_queue_ce->unserialize    = php_ds_queue_unserialize;
  
      zend_declare_class_constant_long(php_ds_queue_ce, STR_AND_LEN("MIN_CAPACITY"), DS_DEQUE_MIN_CAPACITY);
      zend_class_implements(php_ds_queue_ce, 1, collection_ce);
  
      php_ds_register_queue_handlers();
  }
  