@startuml

!includesub ../iterator/HashTableIterator.puml!public_declaration
!includesub ../iterator/NodeModel.puml!public_declaration
!includesub ../collectionCommunication/server/MapServerDispatcher.puml!public_declaration
!includesub ../collectionCommunication/server/SetServerDispatcher.puml!public_declaration

!startsub public_declaration
!ifndef HT_BASE_PUBLIC
!define HT_BASE_PUBLIC

namespace cds {

    namespace __hidden {
        namespace __impl {

            class __HashTable <E, K, H, R, Function <E, K>, BiPredicate <E, E>, Consumer <E>> {
                - {field} _bucketCount : Size
                - {field} _size : Size
                - {field} _pBucketArray : __NodeType **
                - {field} _hasher : H
                - {field} _rehash : R
                ..base methods..
                # {method} __HashTable () noexcept
                # {method} __HashTable (__HashTable const &) noexcept
                # {method} __HashTable (__HashTable &&) noexcept
                - {method} __ht_rehash (Size, Size, __NodeType const *) noexcept -> void
                - {method} {static} __ht_rehashEmplace (__NodeType **, __NodeType *) noexcept -> void
                - {method} __ht_bucket (Size) noexcept -> __NodeType *
                - {method} __ht_bucket (Size) const noexcept -> __NodeType const *
                - {method} __ht_allocateBuckets (Size) noexcept -> void
                - {method} __ht_freeBuckets () noexcept -> void
                - {method} {static} __ht_allocateNode () noexcept -> void
                - {method} {static} __ht_freeNode () noexcept -> void
                ..property methods..
                # {method} __ht_clear () noexcept -> void
                # {method} __ht_empty () const noexcept -> bool
                # {method} __ht_size () const noexcept -> Size
                # {method} __ht_bucketCount () const noexcept -> Size
                # {method} __ht_get (K const &, bool *) noexcept -> E *
                # {method} __ht_getConst (K const &) const noexcept -> E const *
                # {method} __ht_at (K const &) noexcept -> E *
                # {method} __ht_atConst (K const &) const noexcept -> E const *
                # {method} __ht_remove (K const &) noexcept -> bool
                # {method} __ht_removeGetPtr (K const &) noexcept -> E *
                # {method} __ht_remove (__NodeType const *, __NodeType const *, Size) noexcept -> bool
                # {method} <Copy> __ht_copy (__HashTable const &, Copy const &) noexcept -> void
                # {method} __ht_move (__HashTable &&) noexcept -> void
                # {method} <Copy> __ht_copyCleared (__HashTable const &, Copy const &) noexcept -> void
                # {method} __ht_moveCleared (__HashTable &&) noexcept -> void
                # {method} <C> __ht_equals (__HashTable const &) const noexcept -> bool
                ..dispatcher required methods, in order..
                # {method} __ht_begin () noexcept -> __ht_Iterator
                # {method} __ht_end () noexcept -> __ht_Iterator
                # {method} __ht_cbegin () const noexcept -> __ht_ConstIterator
                # {method} __ht_cend () const noexcept -> __ht_ConstIterator
                # {method} __ht_new (E const *, bool *) noexcept -> E *
                # {method} __ht_removeIterator (__ht_Iterator const &) noexcept -> bool
                # {method} __ht_removeConstIterator (__ht_ConstIterator const &) noexcept -> bool
                # {method} __ht_removeIteratorArray (__ht_Iterator const * const *, Size) noexcept -> Size
                # {method} __ht_removeConstIteratorArray (__ht_ConstIterator const * const *, Size) noexcept -> Size
                # {method} __ht_findIterator (K const &) noexcept -> __ht_Iterator
                # {method} __ht_findConstIterator (K const &) const noexcept -> __ht_ConstIterator
            }

            class __HashTable::__ht_Iterator << (T, #aa9999) >>
            class __HashTable::__ht_ConstIterator << (T, #aa9999) >>
            class __HashTable::__NodeType << (T, #aa9999) >>
            class __HashTable::__SetDispatcher <S> implements __SetServerDispatcher
            class __HashTable::__MapDispatcher <S> implements __MapServerDispatcher

            __HashTable::__ht_Iterator "is nested in" .. __HashTable
            __HashTable::__ht_ConstIterator "is nested in" .. __HashTable
            __HashTable::__NodeType "is nested in" .. __HashTable
            __HashTable .. "is nested in" __HashTable::__SetDispatcher
            __HashTable .. "is nested in" __HashTable::__MapDispatcher

            cds.HashTableIterator ... "is" __HashTable::__ht_Iterator
            cds.HashTableConstIterator ... "is" __HashTable::__ht_ConstIterator
            cds.__hidden.__impl.__UnidirectionalNode .. "is" __HashTable::__NodeType

        }
    }

}

!endif
!endsub

!startsub private
remove cds.__hidden.__impl.__Bi*
remove cds.__hidden.__impl.__Red*
!endsub

@enduml