YouCompleteMe/cpp/ycm/CandidateRepository.cpp
Strahinja Val Markovic 7bf18c7c5c Improving IdentifierCompleter performance
We limit the number of candidates returned to Vim to 20 and also make sure that
we are not returning any duplicate candidates. This provides a noticeable
improvement in latency.
2012-07-21 12:06:18 -07:00

113 lines
3.0 KiB
C++

// Copyright (C) 2011, 2012 Strahinja Val Markovic <val@markovic.io>
//
// This file is part of YouCompleteMe.
//
// YouCompleteMe is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// YouCompleteMe is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with YouCompleteMe. If not, see <http://www.gnu.org/licenses/>.
#include "CandidateRepository.h"
#include "Candidate.h"
#include "CompletionData.h"
#include "standard.h"
#include "Utils.h"
#include <boost/thread/locks.hpp>
namespace YouCompleteMe
{
boost::mutex CandidateRepository::singleton_mutex_;
CandidateRepository *CandidateRepository::instance_ = NULL;
CandidateRepository& CandidateRepository::Instance()
{
boost::lock_guard< boost::mutex > locker( singleton_mutex_ );
if ( !instance_ )
{
static CandidateRepository repo;
instance_ = &repo;
}
return *instance_;
}
int CandidateRepository::NumStoredCandidates()
{
boost::lock_guard< boost::mutex > locker( holder_mutex_ );
return candidate_holder_.size();
}
std::vector< const Candidate* > CandidateRepository::GetCandidatesForStrings(
const std::vector< std::string > &strings )
{
std::vector< const Candidate* > candidates;
candidates.reserve( strings.size() );
{
boost::lock_guard< boost::mutex > locker( holder_mutex_ );
foreach ( const std::string &candidate_text, strings )
{
const Candidate *&candidate = GetValueElseInsert( candidate_holder_,
candidate_text,
NULL );
if ( !candidate )
candidate = new Candidate( candidate_text );
candidates.push_back( candidate );
}
}
return candidates;
}
std::vector< const Candidate* > CandidateRepository::GetCandidatesForStrings(
const std::vector< CompletionData > &datas )
{
std::vector< const Candidate* > candidates;
candidates.reserve( datas.size() );
{
boost::lock_guard< boost::mutex > locker( holder_mutex_ );
foreach ( const CompletionData &data, datas )
{
const Candidate *&candidate = GetValueElseInsert( candidate_holder_,
data.original_string_,
NULL );
if ( !candidate )
candidate = new Candidate( data.original_string_ );
candidates.push_back( candidate );
}
}
return candidates;
}
CandidateRepository::~CandidateRepository()
{
foreach ( const CandidateHolder::value_type &pair,
candidate_holder_ )
{
delete pair.second;
}
}
} // namespace YouCompleteMe