// file      : butl/string-table.txx -*- C++ -*-
// copyright : Copyright (c) 2014-2016 Code Synthesis Ltd
// license   : MIT; see accompanying LICENSE file

#include <limits>  // numeric_limits
#include <cstddef> // size_t
#include <cassert>

namespace butl
{
  template <typename I, typename D>
  I string_table<I, D>::
  insert (const D& d)
  {
    std::size_t i (vec_.size () + 1);

    // Note: move(d) would be tricky since the key still points to it.
    //
    auto r (map_.emplace (
              key_type (&traits::key (d)),
              value_type {static_cast<I> (i), d}));

    if (r.second)
    {
      assert (i <= std::numeric_limits<I>::max ());

      r.first->first.p = &traits::key (r.first->second.d); // Update key.
      vec_.push_back (r.first);
    }

    return r.first->second.i;
  }
}