Remove SegmenterInterface as its Segmenter is the only derived class.

Benefits:
- Virtual method call is removed (especially IsBoundary is called
  heavily so its cost is reduced)
- Reduce the number of files to be maintained

This is just a code cleanup.  Hence no behavior change should occur.

BUG=none
TEST=unittest
diff --git a/src/converter/converter.gyp b/src/converter/converter.gyp
index a8cc33f..6f5a650 100644
--- a/src/converter/converter.gyp
+++ b/src/converter/converter.gyp
@@ -52,6 +52,7 @@
         'converter_base.gyp:conversion_request',
         'converter_base.gyp:immutable_converter',
         'converter_base.gyp:immutable_converter_interface',
+        'converter_base.gyp:segmenter',
         'converter_base.gyp:segments',
       ],
     },
diff --git a/src/converter/converter_base.gyp b/src/converter/converter_base.gyp
index c9a35b8..5ebebcf 100644
--- a/src/converter/converter_base.gyp
+++ b/src/converter/converter_base.gyp
@@ -86,6 +86,7 @@
         '../transliteration/transliteration.gyp:transliteration',
         'connector',
         'lattice',
+        'segmenter',
       ],
     },
     {
@@ -127,6 +128,7 @@
         '../session/session_base.gyp:session_protocol',
         'connector',
         'immutable_converter_interface',
+        'segmenter',
         'segments',
       ],
     },
diff --git a/src/converter/converter_test.cc b/src/converter/converter_test.cc
index 66744ce..d3178cf 100644
--- a/src/converter/converter_test.cc
+++ b/src/converter/converter_test.cc
@@ -48,7 +48,6 @@
 #include "converter/immutable_converter_interface.h"
 #include "converter/node.h"
 #include "converter/segmenter.h"
-#include "converter/segmenter_interface.h"
 #include "converter/segments.h"
 #include "data_manager/data_manager_interface.h"
 #include "data_manager/testing/mock_data_manager.h"
@@ -177,7 +176,7 @@
     scoped_ptr<SuppressionDictionary> suppression_dictionary;
     scoped_ptr<DictionaryInterface> suffix_dictionary;
     scoped_ptr<const Connector> connector;
-    scoped_ptr<const SegmenterInterface> segmenter;
+    scoped_ptr<const Segmenter> segmenter;
     scoped_ptr<DictionaryInterface> dictionary;
     scoped_ptr<const PosGroup> pos_group;
     scoped_ptr<const SuggestionFilter> suggestion_filter;
@@ -1244,7 +1243,7 @@
       CreateSuffixDictionaryFromDataManager(data_manager));
   scoped_ptr<const Connector> connector(
       Connector::CreateFromDataManager(data_manager));
-  scoped_ptr<const SegmenterInterface> segmenter(
+  scoped_ptr<const Segmenter> segmenter(
       Segmenter::CreateFromDataManager(data_manager));
   scoped_ptr<const SuggestionFilter> suggestion_filter(
       CreateSuggestionFilter(data_manager));
diff --git a/src/converter/immutable_converter.cc b/src/converter/immutable_converter.cc
index cbf469c..1e2447b 100644
--- a/src/converter/immutable_converter.cc
+++ b/src/converter/immutable_converter.cc
@@ -52,7 +52,7 @@
 #include "converter/node.h"
 #include "converter/node_allocator.h"
 #include "converter/node_list_builder.h"
-#include "converter/segmenter_interface.h"
+#include "converter/segmenter.h"
 #include "converter/segments.h"
 #include "dictionary/dictionary_interface.h"
 #include "dictionary/pos_group.h"
@@ -275,7 +275,7 @@
     const DictionaryInterface *suffix_dictionary,
     const SuppressionDictionary *suppression_dictionary,
     const Connector *connector,
-    const SegmenterInterface *segmenter,
+    const Segmenter *segmenter,
     const POSMatcher *pos_matcher,
     const PosGroup *pos_group,
     const SuggestionFilter *suggestion_filter)
@@ -650,7 +650,7 @@
           if ((lnode->value.size() + rnode->value.size())
               == compound_node->value.size() &&
               (lnode->value + rnode->value) == compound_node->value &&
-              segmenter_->IsBoundary(lnode, rnode, false)) {   // Constraint 3.
+              segmenter_->IsBoundary(*lnode, *rnode, false)) {  // Constraint 3.
             const int32 cost = lnode->wcost + GetCost(lnode, rnode);
             if (cost < best_cost) {   // choose the smallest ones
               best_last_name_node = lnode;
@@ -1767,7 +1767,7 @@
   }
 
   // Grammatically segmented.
-  if (segmenter_->IsBoundary(node, node->next, is_single_segment)) {
+  if (segmenter_->IsBoundary(*node, *node->next, is_single_segment)) {
     return true;
   }
 
diff --git a/src/converter/immutable_converter.h b/src/converter/immutable_converter.h
index 3ee1fc5..f98a6a7 100644
--- a/src/converter/immutable_converter.h
+++ b/src/converter/immutable_converter.h
@@ -51,7 +51,7 @@
 class NBestGenerator;
 class POSMatcher;
 class PosGroup;
-class SegmenterInterface;
+class Segmenter;
 class SuggestionFilter;
 
 class ImmutableConverterImpl : public ImmutableConverterInterface {
@@ -61,7 +61,7 @@
       const DictionaryInterface *suffix_dictionary,
       const dictionary::SuppressionDictionary *suppression_dictionary,
       const Connector *connector,
-      const SegmenterInterface *segmenter,
+      const Segmenter *segmenter,
       const POSMatcher *pos_matcher,
       const PosGroup *pos_group,
       const SuggestionFilter *suggestion_filter);
@@ -184,7 +184,7 @@
   const DictionaryInterface *suffix_dictionary_;
   const dictionary::SuppressionDictionary *suppression_dictionary_;
   const Connector *connector_;
-  const SegmenterInterface *segmenter_;
+  const Segmenter *segmenter_;
   const POSMatcher *pos_matcher_;
   const PosGroup *pos_group_;
   const SuggestionFilter *suggestion_filter_;
diff --git a/src/converter/immutable_converter_test.cc b/src/converter/immutable_converter_test.cc
index 43c67b8..4e402f0 100644
--- a/src/converter/immutable_converter_test.cc
+++ b/src/converter/immutable_converter_test.cc
@@ -45,7 +45,6 @@
 #include "converter/conversion_request.h"
 #include "converter/lattice.h"
 #include "converter/segmenter.h"
-#include "converter/segmenter_interface.h"
 #include "converter/segments.h"
 #include "data_manager/data_manager_interface.h"
 #include "data_manager/testing/mock_data_manager.h"
@@ -163,7 +162,7 @@
   scoped_ptr<const DataManagerInterface> data_manager_;
   scoped_ptr<const SuppressionDictionary> suppression_dictionary_;
   scoped_ptr<const Connector> connector_;
-  scoped_ptr<const SegmenterInterface> segmenter_;
+  scoped_ptr<const Segmenter> segmenter_;
   scoped_ptr<const DictionaryInterface> suffix_dictionary_;
   scoped_ptr<const DictionaryInterface> dictionary_;
   scoped_ptr<const PosGroup> pos_group_;
diff --git a/src/converter/nbest_generator.cc b/src/converter/nbest_generator.cc
index 98f11bc..124019c 100644
--- a/src/converter/nbest_generator.cc
+++ b/src/converter/nbest_generator.cc
@@ -39,7 +39,7 @@
 #include "converter/connector.h"
 #include "converter/lattice.h"
 #include "converter/node.h"
-#include "converter/segmenter_interface.h"
+#include "converter/segmenter.h"
 #include "converter/segments.h"
 #include "dictionary/pos_matcher.h"
 
@@ -106,7 +106,7 @@
 }
 
 NBestGenerator::NBestGenerator(const SuppressionDictionary *suppression_dic,
-                               const SegmenterInterface *segmenter,
+                               const Segmenter *segmenter,
                                const Connector *connector,
                                const POSMatcher *pos_matcher,
                                const Lattice *lattice,
@@ -239,7 +239,7 @@
       const Node *lnode = nodes[i - 1];
       const Node *rnode = nodes[i];
       const bool kMultipleSegments = false;
-      if (segmenter_->IsBoundary(lnode, rnode, kMultipleSegments)) {
+      if (segmenter_->IsBoundary(*lnode, *rnode, kMultipleSegments)) {
         candidate->PushBackInnerSegmentBoundary(
             key_len, value_len, content_key_len, content_value_len);
         key_len = 0;
@@ -498,7 +498,7 @@
   // is_boundary is true if there is a grammer-based boundary
   // between lnode and rnode
   const bool is_boundary = (lnode->node_type == Node::HIS_NODE ||
-                            segmenter_->IsBoundary(lnode, rnode, false));
+                            segmenter_->IsBoundary(*lnode, *rnode, false));
   if (!is_edge && is_boundary) {
     // There is a boundary within the segment.
     return INVALID;
@@ -525,7 +525,7 @@
   // between lnode and rnode
   const bool is_boundary = (
       lnode->node_type == Node::HIS_NODE ||
-      segmenter_->IsBoundary(lnode, rnode, true));
+      segmenter_->IsBoundary(*lnode, *rnode, true));
   if (is_edge != is_boundary) {
     // on the edge, have a boudnary.
     // not on the edge, not the case.
@@ -547,7 +547,7 @@
   // between lnode and rnode
   const bool is_boundary = (
       lnode->node_type == Node::HIS_NODE ||
-      segmenter_->IsBoundary(lnode, rnode, false));
+      segmenter_->IsBoundary(*lnode, *rnode, false));
 
   if (is_edge != is_boundary) {
     // on the edge, have a boudnary.
diff --git a/src/converter/nbest_generator.h b/src/converter/nbest_generator.h
index 259a91f..fc7cd26 100644
--- a/src/converter/nbest_generator.h
+++ b/src/converter/nbest_generator.h
@@ -45,7 +45,7 @@
 class Connector;
 class Lattice;
 class POSMatcher;
-class SegmenterInterface;
+class Segmenter;
 class SuggestionFilter;
 struct Node;
 
@@ -82,7 +82,7 @@
   // Try to enumurate N-best results between begin_node and end_node.
   NBestGenerator(
       const dictionary::SuppressionDictionary *suppression_dictionary,
-      const SegmenterInterface *segmenter,
+      const Segmenter *segmenter,
       const Connector *connector,
       const POSMatcher *pos_matcher,
       const Lattice *lattice,
@@ -171,7 +171,7 @@
 
   // References to relevant modules.
   const dictionary::SuppressionDictionary *suppression_dictionary_;
-  const SegmenterInterface *segmenter_;
+  const Segmenter *segmenter_;
   const Connector *connector_;
   const POSMatcher *pos_matcher_;
   const Lattice *lattice_;
diff --git a/src/converter/nbest_generator_test.cc b/src/converter/nbest_generator_test.cc
index 74ce35d..beb2605 100644
--- a/src/converter/nbest_generator_test.cc
+++ b/src/converter/nbest_generator_test.cc
@@ -41,7 +41,6 @@
 #include "converter/conversion_request.h"
 #include "converter/immutable_converter.h"
 #include "converter/segmenter.h"
-#include "converter/segmenter_interface.h"
 #include "converter/segments.h"
 #include "data_manager/data_manager_interface.h"
 #include "data_manager/testing/mock_data_manager.h"
@@ -145,7 +144,7 @@
   scoped_ptr<const DataManagerInterface> data_manager_;
   scoped_ptr<const SuppressionDictionary> suppression_dictionary_;
   scoped_ptr<const Connector> connector_;
-  scoped_ptr<const SegmenterInterface> segmenter_;
+  scoped_ptr<const Segmenter> segmenter_;
   scoped_ptr<const DictionaryInterface> suffix_dictionary_;
   scoped_ptr<const DictionaryInterface> dictionary_;
   scoped_ptr<const PosGroup> pos_group_;
diff --git a/src/converter/segmenter.cc b/src/converter/segmenter.cc
index 3afe62f..bbae3c9 100644
--- a/src/converter/segmenter.cc
+++ b/src/converter/segmenter.cc
@@ -42,11 +42,11 @@
     const DataManagerInterface &data_manager) {
   size_t l_num_elements = 0;
   size_t r_num_elements = 0;
-  const uint16 *l_table = NULL;
-  const uint16 *r_table = NULL;
+  const uint16 *l_table = nullptr;
+  const uint16 *r_table = nullptr;
   size_t bitarray_num_bytes = 0;
-  const char *bitarray_data = NULL;
-  const BoundaryData *boundary_data = NULL;
+  const char *bitarray_data = nullptr;
+  const BoundaryData *boundary_data = nullptr;
   data_manager.GetSegmenterData(&l_num_elements, &r_num_elements,
                                 &l_table, &r_table,
                                 &bitarray_num_bytes, &bitarray_data,
@@ -74,16 +74,14 @@
 
 Segmenter::~Segmenter() {}
 
-bool Segmenter::IsBoundary(const Node *lnode, const Node *rnode,
+bool Segmenter::IsBoundary(const Node &lnode, const Node &rnode,
                            bool is_single_segment) const {
-  DCHECK(lnode);
-  DCHECK(rnode);
-  if (lnode->node_type == Node::BOS_NODE ||
-      rnode->node_type == Node::EOS_NODE) {
+  if (lnode.node_type == Node::BOS_NODE ||
+      rnode.node_type == Node::EOS_NODE) {
     return true;
   }
 
-  // return always false in prediction mode.
+  // Always return false in prediction mode.
   // This implies that converter always returns single-segment-result
   // in prediction mode.
   if (is_single_segment) {
@@ -97,11 +95,11 @@
   // If we segment "に書く" into two segments, "二角" is never be shown.
   // There exits some implicit assumpution that user expects that his/her input
   // becomes one bunsetu. So, it would be better to keep "二角" even after "紙".
-  if (lnode->attributes & Node::STARTS_WITH_PARTICLE) {
+  if (lnode.attributes & Node::STARTS_WITH_PARTICLE) {
     return false;
   }
 
-  return IsBoundary(lnode->rid, rnode->lid);
+  return IsBoundary(lnode.rid, rnode.lid);
 }
 
 bool Segmenter::IsBoundary(uint16 rid, uint16 lid) const {
diff --git a/src/converter/segmenter.h b/src/converter/segmenter.h
index 74e4b4c..be7cc29 100644
--- a/src/converter/segmenter.h
+++ b/src/converter/segmenter.h
@@ -31,7 +31,6 @@
 #define MOZC_CONVERTER_SEGMENTER_H_
 
 #include "base/port.h"
-#include "converter/segmenter_interface.h"
 
 namespace mozc {
 
@@ -39,7 +38,7 @@
 struct Node;
 struct BoundaryData;
 
-class Segmenter : public SegmenterInterface {
+class Segmenter {
  public:
   static Segmenter *CreateFromDataManager(
       const DataManagerInterface &data_manager);
@@ -49,16 +48,16 @@
             const uint16 *l_table, const uint16 *r_table,
             size_t bitarray_num_bytes, const char *bitarray_data,
             const BoundaryData *boundary_data);
-  virtual ~Segmenter();
+  ~Segmenter();
 
-  virtual bool IsBoundary(const Node *lnode, const Node *rnode,
-                          bool is_single_segment) const;
+  bool IsBoundary(const Node &lnode, const Node &rnode,
+                  bool is_single_segment) const;
 
-  virtual bool IsBoundary(uint16 rid, uint16 lid) const;
+  bool IsBoundary(uint16 rid, uint16 lid) const;
 
-  virtual int32 GetPrefixPenalty(uint16 lid) const;
+  int32 GetPrefixPenalty(uint16 lid) const;
 
-  virtual int32 GetSuffixPenalty(uint16 rid) const;
+  int32 GetSuffixPenalty(uint16 rid) const;
 
  private:
   const size_t l_num_elements_;
@@ -68,6 +67,8 @@
   const size_t bitarray_num_bytes_;
   const char *bitarray_data_;
   const BoundaryData *boundary_data_;
+
+  DISALLOW_COPY_AND_ASSIGN(Segmenter);
 };
 
 }  // namespace mozc
diff --git a/src/converter/segmenter_interface.h b/src/converter/segmenter_interface.h
deleted file mode 100644
index 1b89c6a..0000000
--- a/src/converter/segmenter_interface.h
+++ /dev/null
@@ -1,69 +0,0 @@
-// Copyright 2010-2015, Google Inc.
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without
-// modification, are permitted provided that the following conditions are
-// met:
-//
-//     * Redistributions of source code must retain the above copyright
-// notice, this list of conditions and the following disclaimer.
-//     * Redistributions in binary form must reproduce the above
-// copyright notice, this list of conditions and the following disclaimer
-// in the documentation and/or other materials provided with the
-// distribution.
-//     * Neither the name of Google Inc. nor the names of its
-// contributors may be used to endorse or promote products derived from
-// this software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
-// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
-// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
-// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
-// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
-// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
-// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
-// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
-// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
-// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
-// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-
-#ifndef MOZC_CONVERTER_SEGMENTER_INTERFACE_H_
-#define MOZC_CONVERTER_SEGMENTER_INTERFACE_H_
-
-#include "base/port.h"
-
-namespace mozc {
-
-struct Node;
-
-class SegmenterInterface {
- public:
-  virtual ~SegmenterInterface() {}
-
-  // Returns true if there is a segment boundary between |lnode| and |rnode|.
-  // If |is_single_segment| is true, this function basically reutrns false
-  // unless |lnode| or |rnode| is BOS/EOS.  |is_single_segment| is used for
-  // prediction/suggestion mode.
-  virtual bool IsBoundary(const Node *lnode, const Node *rnode,
-                          bool is_single_segment) const = 0;
-
-  virtual bool IsBoundary(uint16 rid, uint16 lid) const = 0;
-
-  // Returns cost penalty of the word prefix.  We can add cost penalty if a
-  // node->lid exists at the begging of user input.
-  virtual int32 GetPrefixPenalty(uint16 lid) const = 0;
-
-  // Returns cost penalty of the word suffix.  We can add cost penalty if a
-  // node->rid exists at the end of user input.
-  virtual int32 GetSuffixPenalty(uint16 rid) const = 0;
-
- protected:
-  SegmenterInterface() {}
-
- private:
-  DISALLOW_COPY_AND_ASSIGN(SegmenterInterface);
-};
-
-}  // namespace mozc
-
-#endif  // MOZC_CONVERTER_SEGMENTER_INTERFACE_H_
diff --git a/src/data_manager/data_manager_test_base.cc b/src/data_manager/data_manager_test_base.cc
index 518223c..90599bf 100644
--- a/src/data_manager/data_manager_test_base.cc
+++ b/src/data_manager/data_manager_test_base.cc
@@ -40,7 +40,7 @@
 #include "base/util.h"
 #include "converter/connector.h"
 #include "converter/node.h"
-#include "converter/segmenter_base.h"
+#include "converter/segmenter.h"
 #include "data_manager/connection_file_reader.h"
 #include "data_manager/data_manager_interface.h"
 #include "dictionary/pos_matcher.h"
@@ -105,8 +105,8 @@
     for (size_t lid = 0; lid < rsize_; ++lid) {
       lnode.rid = rid;
       lnode.lid = lid;
-      EXPECT_TRUE(segmenter->IsBoundary(&lnode, &rnode, false));
-      EXPECT_TRUE(segmenter->IsBoundary(&lnode, &rnode, true));
+      EXPECT_TRUE(segmenter->IsBoundary(lnode, rnode, false));
+      EXPECT_TRUE(segmenter->IsBoundary(lnode, rnode, true));
     }
   }
 }
@@ -123,8 +123,8 @@
     for (size_t lid = 0; lid < rsize_; ++lid) {
       lnode.rid = rid;
       lnode.lid = lid;
-      EXPECT_TRUE(segmenter->IsBoundary(&lnode, &rnode, false));
-      EXPECT_TRUE(segmenter->IsBoundary(&lnode, &rnode, true));
+      EXPECT_TRUE(segmenter->IsBoundary(lnode, rnode, false));
+      EXPECT_TRUE(segmenter->IsBoundary(lnode, rnode, true));
     }
   }
 }
@@ -141,8 +141,8 @@
       lnode.rid = rid;
       rnode.lid = lid;
       EXPECT_EQ(segmenter->IsBoundary(rid, lid),
-                segmenter->IsBoundary(&lnode, &rnode, false));
-      EXPECT_FALSE(segmenter->IsBoundary(&lnode, &rnode, true));
+                segmenter->IsBoundary(lnode, rnode, false));
+      EXPECT_FALSE(segmenter->IsBoundary(lnode, rnode, true));
     }
   }
 }
@@ -161,10 +161,10 @@
   lnode.rid = pos_matcher->GetAcceptableParticleAtBeginOfSegmentId();
   // "名詞,サ変".
   rnode.lid = pos_matcher->GetUnknownId();
-  EXPECT_TRUE(segmenter->IsBoundary(&lnode, &rnode, false));
+  EXPECT_TRUE(segmenter->IsBoundary(lnode, rnode, false));
 
   lnode.attributes |= Node::STARTS_WITH_PARTICLE;
-  EXPECT_FALSE(segmenter->IsBoundary(&lnode, &rnode, false));
+  EXPECT_FALSE(segmenter->IsBoundary(lnode, rnode, false));
 }
 
 void DataManagerTestBase::ConnectorTest_RandomValueCheck() {
diff --git a/src/engine/engine.h b/src/engine/engine.h
index b606abd..39f456d 100644
--- a/src/engine/engine.h
+++ b/src/engine/engine.h
@@ -45,7 +45,7 @@
 class ImmutableConverterInterface;
 class PredictorInterface;
 class RewriterInterface;
-class SegmenterInterface;
+class Segmenter;
 class SuggestionFilter;
 class UserDataManagerInterface;
 
@@ -78,7 +78,7 @@
  private:
   scoped_ptr<dictionary::SuppressionDictionary> suppression_dictionary_;
   scoped_ptr<const Connector> connector_;
-  scoped_ptr<const SegmenterInterface> segmenter_;
+  scoped_ptr<const Segmenter> segmenter_;
   scoped_ptr<dictionary::UserDictionary> user_dictionary_;
   scoped_ptr<DictionaryInterface> suffix_dictionary_;
   scoped_ptr<DictionaryInterface> dictionary_;
diff --git a/src/mozc_version_template.txt b/src/mozc_version_template.txt
index 843d169..e3e2748 100644
--- a/src/mozc_version_template.txt
+++ b/src/mozc_version_template.txt
@@ -1,6 +1,6 @@
 MAJOR=2
 MINOR=17
-BUILD=2085
+BUILD=2086
 REVISION=102
 # NACL_DICTIONARY_VERSION is the target version of the system dictionary to be
 # downloaded by NaCl Mozc.
diff --git a/src/prediction/dictionary_predictor.cc b/src/prediction/dictionary_predictor.cc
index f09e533..8b4230d 100644
--- a/src/prediction/dictionary_predictor.cc
+++ b/src/prediction/dictionary_predictor.cc
@@ -52,7 +52,7 @@
 #include "converter/converter_interface.h"
 #include "converter/immutable_converter_interface.h"
 #include "converter/node_list_builder.h"
-#include "converter/segmenter_interface.h"
+#include "converter/segmenter.h"
 #include "converter/segments.h"
 #include "dictionary/dictionary_interface.h"
 #include "dictionary/pos_matcher.h"
@@ -294,7 +294,7 @@
     const DictionaryInterface *dictionary,
     const DictionaryInterface *suffix_dictionary,
     const Connector *connector,
-    const SegmenterInterface *segmenter,
+    const Segmenter *segmenter,
     const POSMatcher *pos_matcher,
     const SuggestionFilter *suggestion_filter)
     : converter_(converter),
diff --git a/src/prediction/dictionary_predictor.h b/src/prediction/dictionary_predictor.h
index 99ab695..341707f 100644
--- a/src/prediction/dictionary_predictor.h
+++ b/src/prediction/dictionary_predictor.h
@@ -48,7 +48,7 @@
 class DictionaryInterface;
 class ImmutableConverterInterface;
 class POSMatcher;
-class SegmenterInterface;
+class Segmenter;
 class Segments;
 class SuggestionFilter;
 
@@ -62,7 +62,7 @@
                       const DictionaryInterface *dictionary,
                       const DictionaryInterface *suffix_dictionary,
                       const Connector *connector,
-                      const SegmenterInterface *segmenter,
+                      const Segmenter *segmenter,
                       const POSMatcher *pos_matcher,
                       const SuggestionFilter *suggestion_filter);
   virtual ~DictionaryPredictor();
@@ -424,7 +424,7 @@
   const DictionaryInterface *dictionary_;
   const DictionaryInterface *suffix_dictionary_;
   const Connector *connector_;
-  const SegmenterInterface *segmenter_;
+  const Segmenter *segmenter_;
   const SuggestionFilter *suggestion_filter_;
   const uint16 counter_suffix_word_id_;
   const string predictor_name_;
diff --git a/src/prediction/dictionary_predictor_test.cc b/src/prediction/dictionary_predictor_test.cc
index fd7762e..fbc3e0c 100644
--- a/src/prediction/dictionary_predictor_test.cc
+++ b/src/prediction/dictionary_predictor_test.cc
@@ -157,7 +157,7 @@
       const DictionaryInterface *dictionary,
       const DictionaryInterface *suffix_dictionary,
       const Connector *connector,
-      const SegmenterInterface *segmenter,
+      const Segmenter *segmenter,
       const POSMatcher *pos_matcher,
       const SuggestionFilter *suggestion_filter)
       : DictionaryPredictor(converter,
@@ -269,7 +269,7 @@
   const POSMatcher *pos_matcher_;
   scoped_ptr<SuppressionDictionary> suppression_dictionary_;
   scoped_ptr<const Connector> connector_;
-  scoped_ptr<const SegmenterInterface> segmenter_;
+  scoped_ptr<const Segmenter> segmenter_;
   scoped_ptr<const DictionaryInterface> suffix_dictionary_;
   scoped_ptr<const DictionaryInterface> dictionary_;
   DictionaryMock *dictionary_mock_;
@@ -1561,7 +1561,7 @@
       CreateSuffixDictionaryFromDataManager(data_manager));
   scoped_ptr<const Connector> connector(
       Connector::CreateFromDataManager(data_manager));
-  scoped_ptr<const SegmenterInterface> segmenter(
+  scoped_ptr<const Segmenter> segmenter(
       Segmenter::CreateFromDataManager(data_manager));
   scoped_ptr<const SuggestionFilter> suggestion_filter(
       CreateSuggestionFilter(data_manager));
@@ -3133,7 +3133,7 @@
       CreateSuffixDictionaryFromDataManager(data_manager));
   scoped_ptr<const Connector> connector(
       Connector::CreateFromDataManager(data_manager));
-  scoped_ptr<const SegmenterInterface> segmenter(
+  scoped_ptr<const Segmenter> segmenter(
       Segmenter::CreateFromDataManager(data_manager));
   scoped_ptr<const SuggestionFilter> suggestion_filter(
       CreateSuggestionFilter(data_manager));
diff --git a/src/prediction/prediction.gyp b/src/prediction/prediction.gyp
index 21badd8..f68875c 100644
--- a/src/prediction/prediction.gyp
+++ b/src/prediction/prediction.gyp
@@ -49,6 +49,7 @@
         '../composer/composer.gyp:composer',
         '../converter/converter_base.gyp:conversion_request',
         '../converter/converter_base.gyp:immutable_converter',
+        '../converter/converter_base.gyp:segmenter',
         '../converter/converter_base.gyp:segments',
         '../dictionary/dictionary.gyp:dictionary',
         '../dictionary/dictionary.gyp:suffix_dictionary',