NVBIO
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros Groups Pages
utils.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 
33 
34 namespace nvbio {
35 
36 template <typename StringType>
37 struct lmem_selector {};
38 
39 template <typename StreamType,
40  typename SymbolType,
41  uint32 SYMBOL_SIZE_T,
42  bool BIG_ENDIAN_T>
43 struct lmem_selector< vector_view< PackedStream<StreamType,SymbolType,SYMBOL_SIZE_T,BIG_ENDIAN_T> > >
44 {
45  typedef typename std::iterator_traits<StreamType>::value_type type;
46 
47  static const uint32 SYMBOLS_PER_WORD = (sizeof(type)*8)/SYMBOL_SIZE_T;
48  static const uint32 WORDS = 512 / SYMBOLS_PER_WORD;
49 };
50 
51 template <typename StreamType,
52  typename SymbolType,
53  uint32 SYMBOL_SIZE_T,
54  bool BIG_ENDIAN_T,
55  typename W>
57 vector_view< typename PackedStream<const_cached_iterator<const W*>,SymbolType,SYMBOL_SIZE_T,BIG_ENDIAN_T>::iterator >
60  W* lmem)
61 {
62  const StreamType in_stream = string.begin().stream();
63  const uint32 in_offset = string.begin().index();
64  const uint32 N = string.length();
65 
66  typedef typename std::iterator_traits<StreamType>::value_type word_type;
67 
68  const uint32 SYMBOLS_PER_WORD = (sizeof(word_type)*8) / SYMBOL_SIZE_T;
69  uint32 word_offset = in_offset & (SYMBOLS_PER_WORD-1);
70  uint32 begin_word = in_offset / SYMBOLS_PER_WORD;
71  uint32 end_word = (in_offset + N + SYMBOLS_PER_WORD-1) / SYMBOLS_PER_WORD;
72 
73  for (uint32 word = begin_word; word < end_word; ++word)
74  lmem[word - begin_word] = in_stream[ word ];
75 
76  typedef PackedStream<const_cached_iterator<const W*>,uint8,SYMBOL_SIZE_T,BIG_ENDIAN_T> const_stream_type;
77  const_stream_type clmem_stream( lmem );
78 
79  return vector_view<const_stream_type>( N, clmem_stream + word_offset );
80 }
81 
82 } // namespace nvbio