aboutsummaryrefslogtreecommitdiff
path: root/libbutl/string-table.txx
blob: 77079b28240e4dc4bb70fda994abb6eada1347c6 (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
// file      : libbutl/string-table.txx -*- C++ -*-
// copyright : Copyright (c) 2014-2019 Code Synthesis Ltd
// license   : MIT; see accompanying LICENSE file

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_type::key (d)),
                          value_type {static_cast<I> (i), d}));

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

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

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