/// <summary>
 /// Creates a new fail safe repository wrapper.
 /// </summary>
 /// <param name="repository">The repository to wrap.</param>
 /// <param name="deactivationTimeSpan">The time to deactivate the repository for in the event of a failure. Use <see cref="System.TimeSpan.Zero"/> to deactivate forever.</param>
 public CodeDocRepositoryFailureProtectionWrapper(ICodeDocMemberRepository repository, TimeSpan deactivationTimeSpan)
     : base(repository)
 {
     Contract.Requires(repository != null);
     DeactivationTimeSpan = deactivationTimeSpan;
     _active = true;
     _deactivatedTime = default(DateTime);
 }
 /// <summary>
 /// Creates a new repository wrapper for another <paramref name="repository"/>.
 /// </summary>
 /// <param name="repository">The repository to wrap.</param>
 protected CodeDocRepositoryWrapperBase(ICodeDocMemberRepository repository)
 {
     if (repository == null) throw new ArgumentNullException("repository");
     Contract.EndContractBlock();
     Repository = repository;
 }
 /// <summary>
 /// Constructs a new search context with the given repositories and detail level.
 /// </summary>
 /// <param name="repository">The repository that is to be searched.</param>
 /// <param name="detailLevel">The desired detail level.</param>
 public CodeDocRepositorySearchContext(ICodeDocMemberRepository repository, CodeDocMemberDetailLevel detailLevel = CodeDocMemberDetailLevel.Full)
     : this(new ReadOnlyCollection<ICodeDocMemberRepository>(new[] { repository }), detailLevel)
 {
     if(repository == null) throw new ArgumentNullException("repository");
     Contract.EndContractBlock();
 }
 /// <summary>
 /// Marks a repository as visited.
 /// </summary>
 /// <param name="repository"></param>
 /// <returns><c>true</c> when the repository is marked as visited.</returns>
 public bool Visit(ICodeDocMemberRepository repository)
 {
     if(repository == null) throw new ArgumentNullException("repository");
     Contract.EndContractBlock();
     if (!IsReferenced(repository))
         return false;
     return _visitedRepositories.Add(repository);
 }
 public bool IsReferenced(ICodeDocMemberRepository repository)
 {
     return AllRepositories.Contains(repository);
 }
 /// <summary>
 /// Clones this search context with only the given repository marked as visited and an overridden detail level.
 /// </summary>
 /// <param name="repository">The repository that is to be marked as visited.</param>
 /// <param name="detailLevel">The desired detail level.</param>
 /// <returns>A search context.</returns>
 public CodeDocRepositorySearchContext CloneWithSingleVisit(ICodeDocMemberRepository repository, CodeDocMemberDetailLevel detailLevel)
 {
     if(repository == null) throw new ArgumentNullException("repository");
     Contract.Ensures(Contract.Result<CodeDocRepositorySearchContext>() != null);
     var result = CloneWithoutVisits(detailLevel);
     result.Visit(repository);
     return result;
 }
 /// <summary>
 /// Clones this search context with only the given repository marked as visited.
 /// </summary>
 /// <param name="repository">The repository that is to be marked as visited.</param>
 /// <returns>A search context.</returns>
 public CodeDocRepositorySearchContext CloneWithSingleVisit(ICodeDocMemberRepository repository)
 {
     if(repository == null) throw new ArgumentNullException();
     Contract.Ensures(Contract.Result<CodeDocRepositorySearchContext>() != null);
     return CloneWithSingleVisit(repository, DetailLevel);
 }
 /// <summary>
 /// Clones this search context with only the given repository marked as unvisited and an overridden detail level.
 /// </summary>
 /// <param name="targetRepository">The repository that is to be unvisited.</param>
 /// <param name="detailLevel">The desired detail level.</param>
 /// <returns>A search context.</returns>
 public CodeDocRepositorySearchContext CloneWithOneUnvisited(ICodeDocMemberRepository targetRepository, CodeDocMemberDetailLevel detailLevel)
 {
     Contract.Ensures(Contract.Result<CodeDocRepositorySearchContext>() != null);
     var result = CloneWithoutVisits(detailLevel);
     foreach (var repository in result.AllRepositories)
         if (repository != targetRepository)
             result.Visit(repository);
     return result;
 }
 /// <summary>
 /// Clones this search context with only the given repository marked as unvisited.
 /// </summary>
 /// <param name="targetRepository">The repository that is to be unvisited.</param>
 /// <returns>A search context.</returns>
 public CodeDocRepositorySearchContext CloneWithOneUnvisited(ICodeDocMemberRepository targetRepository)
 {
     Contract.Ensures(Contract.Result<CodeDocRepositorySearchContext>() != null);
     return CloneWithOneUnvisited(targetRepository, DetailLevel);
 }
 /// <summary>
 /// Creates a new locking wrapper for another repository.
 /// </summary>
 /// <param name="repository">The repository to wrap.</param>
 public ThreadSafeCodeDocRepositoryWrapper(ICodeDocMemberRepository repository)
     : base(repository)
 {
     Contract.Requires(repository != null);
     _mutex = new object();
 }