#region Copyright and License
//
// Fizzler - CSS Selector Engine for Microsoft .NET Framework
// Copyright (c) 2009 Atif Aziz, Colin Ramsay. All rights reserved.
//
// This library is free software; you can redistribute it and/or modify it under
// the terms of the GNU Lesser General Public License as published by the Free
// Software Foundation; either version 3 of the License, or (at your option)
// any later version.
//
// This library 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 Lesser General Public License for more
// details.
//
// You should have received a copy of the GNU Lesser General Public License
// along with this library; if not, write to the Free Software Foundation, Inc.,
// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
//
#endregion
namespace Fizzler
{
#region Imports
using System;
using System.Collections.Generic;
using System.Diagnostics;
#endregion
///
/// Implementation for a selectors compiler that supports caching.
///
///
/// This class is primarily targeted for developers of selection
/// over an arbitrary document model.
///
public static class SelectorsCachingCompiler
{
///
/// Creates a caching selectors compiler on top on an existing compiler.
///
public static Func Create(Func compiler)
{
return Create(compiler, null);
}
///
/// Creates a caching selectors compiler on top on an existing compiler.
/// An addition parameter specified a dictionary to use as the cache.
///
///
/// If is null then this method uses a
/// the implementation with an
/// ordinally case-insensitive selectors text comparer.
///
public static Func Create(Func compiler, IDictionary cache)
{
if(compiler == null) throw new ArgumentNullException("compiler");
return CreateImpl(compiler, cache ?? new Dictionary(StringComparer.OrdinalIgnoreCase));
}
private static Func CreateImpl(Func compiler, IDictionary cache)
{
Debug.Assert(compiler != null);
Debug.Assert(cache != null);
return selector =>
{
T compiled;
return cache.TryGetValue(selector, out compiled)
? compiled
: cache[selector] = compiler(selector);
};
}
}
}