1 /*  $Id: best_feat_finder.hpp 294361 2011-05-23 17:12:56Z kornbluh $
2  * ===========================================================================
3  *
4  *                            PUBLIC DOMAIN NOTICE
5  *               National Center for Biotechnology Information
6  *
7  *  This software/database is a "United States Government Work" under the
8  *  terms of the United States Copyright Act.  It was written as part of
9  *  the author's official duties as a United States Government employee and
10  *  thus cannot be copyrighted.  This software/database is freely available
11  *  to the public for use. The National Library of Medicine and the U.S.
12  *  Government have not placed any restriction on its use or reproduction.
13  *
14  *  Although all reasonable efforts have been taken to ensure the accuracy
15  *  and reliability of the software and data, the NLM and the U.S.
16  *  Government do not and cannot warrant the performance or results that
17  *  may be obtained by using this software or data. The NLM and the U.S.
18  *  Government disclaim all warranties, express or implied, including
19  *  warranties of performance, merchantability or fitness for any particular
20  *  purpose.
21  *
22  *  Please cite the author in any work or product based on this material.
23  *
24  * ===========================================================================
25  *
26  * Author: Michael Kornbluh
27  *
28  * File Description:
29  *   stores feats for efficient retrieval in finding the best one.
30  *
31  */
32 
33 #ifndef BEST_FEAT_FINDER__HPP
34 #define BEST_FEAT_FINDER__HPP
35 
36 #include <map>
37 #include <corelib/ncbiobj.hpp>
38 
39 BEGIN_NCBI_SCOPE
40 BEGIN_SCOPE(objects) // namespace ncbi::objects::
41 
42 class CSeq_feat;
43 class CSeq_loc;
44 
45 //  ============================================================================
46 class CBestFeatFinder
47 //  ============================================================================
48 {
49 public:
50     CBestFeatFinder(void);
51 
52     // returns true if successfully added
53     bool AddFeat( const CSeq_feat& new_cds );
54 
55     // Finds the feat that overlaps the given location with the fewest extra bases.
56     CConstRef<CSeq_feat> FindBestFeatForLoc( const CSeq_loc &sought_loc ) const;
57     // Same as previous, but allows you to pass start/stop integers rather than having
58     // to construct a CSeq_interval object.
59     CConstRef<CSeq_feat> FindBestFeatForLoc( const int start_pos, const int stop_pos ) const;
60 
61 private:
62 
63     class CSeqLocSort {
64     public:
65         bool operator()( const CConstRef<CSeq_loc> &loc1, const CConstRef<CSeq_loc> &loc2 ) const;
66     };
67 
68     typedef std::multimap< CConstRef<CSeq_loc>, CConstRef<CSeq_feat>, CSeqLocSort > TLocToFeatMap;
69     TLocToFeatMap loc_to_feat_map;
70 };
71 
72 END_SCOPE(objects)
73 END_NCBI_SCOPE
74 
75 #endif // BEST_CDS_FINDER__HPP
76