NVBIO
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
sorted_dictionary_inl.h
Go to the documentation of this file.
1 /*
2  * nvbio
3  * Copyright (c) 2011-2014, NVIDIA CORPORATION. All rights reserved.
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions are met:
7  * * Redistributions of source code must retain the above copyright
8  * notice, this list of conditions and the following disclaimer.
9  * * Redistributions in binary form must reproduce the above copyright
10  * notice, this list of conditions and the following disclaimer in the
11  * documentation and/or other materials provided with the distribution.
12  * * Neither the name of the NVIDIA CORPORATION nor the
13  * names of its contributors may be used to endorse or promote products
14  * derived from this software without specific prior written permission.
15  *
16  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
17  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19  * DISCLAIMED. IN NO EVENT SHALL NVIDIA CORPORATION BE LIABLE FOR ANY
20  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25  * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26  */
27 
28 #pragma once
29 
30 #include <nvbio/basic/numbers.h>
32 #include <nvbio/basic/algorithms.h>
33 
34 namespace nvbio {
35 
36 // constructor
37 //
38 template <uint32 ALPHABET_SIZE_T, typename Iterator>
41  m_seq( seq ), m_size( size )
42 {}
43 
44 // return the root node of the dictionary seen as a trie
45 //
46 template <uint32 ALPHABET_SIZE_T, typename Iterator>
50 {
51  return node_type( 0u, m_size, length( m_seq[m_size-1] ) );
52 }
53 
54 // visit the children of a given node
55 //
56 template <uint32 ALPHABET_SIZE_T, typename Iterator>
57 template <typename Visitor>
60 {
61  // check subranges
62  const uint8 lc = m_seq[ node.begin ][ node.level-1u ];
63  const uint8 rc = m_seq[ node.end-1 ][ node.level-1u ];
64 
65  uint32 l_boundary = node.begin;
66  uint8 c = lc;
67  while (c < rc)
68  {
69  const uint32 r_boundary = uint32( upper_bound(
70  c,
71  make_transform_iterator( m_seq, get_char_functor<string_type>( node.level-1u ) ) + l_boundary,
72  node.end - l_boundary ) - make_transform_iterator( m_seq, get_char_functor<string_type>( node.level-1u ) ) );
73 
74  visitor.visit( c, node_type( l_boundary, r_boundary, node.level-1u ) );
75 
76  l_boundary = r_boundary;
77  c = m_seq[r_boundary][node.level-1u];
78  }
79  // last child
80  visitor.visit( rc, node_type( l_boundary, node.end, node.level-1u ) );
81 }
82 
83 // return true if the node is a leaf
84 //
85 template <uint32 ALPHABET_SIZE_T, typename Iterator>
88 {
89  return node.level == 0u;
90 }
91 
92 // return the size of a node
93 //
94 template <uint32 ALPHABET_SIZE_T, typename Iterator>
97 {
98  return node.end - node.begin;
99 }
100 
101 } // namespace nvbio