aboutsummaryrefslogtreecommitdiff
path: root/butl/string-table.txx
blob: 8e97157c398727a21ea2dd555ce7b6c8dbe5f9f7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
// 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;
  }
}