
// Copyright (c) 1999-2011 by Digital Mars
// All Rights Reserved
// written by Walter Bright
// http://www.digitalmars.com
// License for redistribution is by either the Artistic License
// in artistic.txt, or the GNU General Public License in gnu.txt.
// See the included readme.txt for details.


#ifndef STRINGTABLE_H
#define STRINGTABLE_H

#if __SC__
#pragma once
#endif

#include "root.h"

struct StringEntry;

// StringValue is a variable-length structure as indicated by the last array
// member with unspecified size.  It has neither proper c'tors nor a factory
// method because the only thing which should be creating these is StringTable.
struct StringValue
{
    union
    {
        void *ptrvalue;
        char *string;
    };
private:
    unsigned length;

#ifndef IN_GCC
#if _MSC_VER
    // Disable warning about nonstandard extension
    #pragma warning (disable : 4200)
#endif
#endif
    char lstring[];

public:
    unsigned len() const { return length; }
    const char *toDchars() const { return lstring; }

private:
    friend struct StringEntry;
    StringValue();  // not constructible
    // This is more like a placement new c'tor
    void ctor(const char *p, unsigned length);
};

struct StringTable
{
private:
    void **table;
    unsigned count;
    unsigned tabledim;

public:
    void init(unsigned size = 37);
    ~StringTable();

    StringValue *lookup(const char *s, unsigned len);
    StringValue *insert(const char *s, unsigned len);
    StringValue *update(const char *s, unsigned len);

private:
    void **search(const char *s, unsigned len);
};

#endif
