www.digitalmars.com         C & C++   DMDScript  

c++.stlsoft - platformstl::memory_mapped_file + stlsoft::basic_string_view example

Chris, et al.

Here's an example project demonstrating the use of PlatformSTL's
memory_mapped_file with STLSoft's string_view.

The bit to note is that, in the code extract shown below, there is not a single
memory allocation (or no call to 
::operator new(),  at least), outside the call to the operating system's mmap()
(or equiv.). That's pretty good, eh? :-)

You'll also need to put in the new integer_to_string.hpp in
"$(STLSOFT_INCLUDE)/inprogress/stlsoft".

Cheers

Matthew

<code>
  /* . */
  if(NULL == inputFileName)
  {
    usage(1, "Must specify file to process", -1, argc, argv);
  }
  else
  {
    // Define the local string type: a string_view on char type
    typedef ::stlsoft::basic_string_view<char>        string_view_t;

    // Declare the mem-map file and string view variables
    ::platformstl::memory_mapped_file mmf(inputFileName);
    string_view_t                     sv(static_cast<char const
*>(mmf.memory()), mmf.size());

    // Now we'll do things with it

    // 0. Define the delimiter for the ambient operating system
#if defined(PLATFORMSTL_OS_IS_UNIX)
    const string_view_t         delimiter("\n", 1);
#elif defined(PLATFORMSTL_OS_IS_WIN32)
    const string_view_t         delimiter("\r\n", 2);
#else
# error Operating system not discriminated
#endif /* platform */

    // 1. Count the number of chars
    {
      size_t  numChars  = std::distance(sv.begin(), sv.end());

      cout << "Number of characters:            " << numChars << endl;
    }

    // 2. Count the number of lines (using stlsoft::string_tokeniser)
    {
      typedef ::stlsoft::string_tokeniser<  string_view_t
                        , string_view_t
                        , ::stlsoft::string_tokeniser_ignore_blanks<false>
                        >           tokeniser_keep_blanks_t;

      tokeniser_keep_blanks_t lines(sv.begin(), sv.end(), delimiter);
      size_t                  numLines  = ::std::distance(lines.begin(),
lines.end());

      cout << "Number of lines:                 " << numLines << endl;
    }

    // 3. Count the number of non-blank lines (using stlsoft::string_tokeniser)
    {
      typedef ::stlsoft::string_tokeniser<  string_view_t
                        , string_view_t
                        >           tokeniser_t;

      tokeniser_t lines(sv.begin(), sv.end(), delimiter);
      size_t      numLines  = ::std::distance(lines.begin(), lines.end());

      cout << "Number of lines (non-blank):     " << numLines << endl;
    }

    // 4. Count the number of lines (using stlsoft::string_tokeniser + rangelib
stuff)
    {
      typedef ::stlsoft::string_tokeniser<  string_view_t
                        , string_view_t
                        , ::stlsoft::string_tokeniser_ignore_blanks<false>
                        >           tokeniser_keep_blanks_t;

      size_t  numLines =
::rangelib::r_distance(rangelib::make_sequence_range(tokeniser_keep_
lanks_t(sv.begin(), 
sv.end(), delimiter)));

      cout << "Number of lines (R):             " << numLines << endl;
    }

    // 5. Count the number of lines (using stlsoft::string_tokeniser + rangelib
stuff)
    {
      typedef ::stlsoft::string_tokeniser<  string_view_t
                        , string_view_t
                        >           tokeniser_t;

      size_t  numLines =
::rangelib::r_distance(rangelib::make_sequence_range(tokeniser_t(sv.begin(),
sv.end(), 
delimiter)));

      cout << "Number of lines (non-blank) (R): " << numLines << endl;
    }

    // 6. Display each line, indexed (using stlsoft::string_tokeniser +
rangelib stuff)
    {
      typedef ::stlsoft::string_tokeniser<  string_view_t
                        , string_view_t
                        , ::stlsoft::string_tokeniser_ignore_blanks<false>
                        >             tokeniser_t;
      typedef ::rangelib::sequence_range<   tokeniser_t>     
tokenised_sequence_t;
      typedef ::rangelib::indexed_range<    tokenised_sequence_t
                        , size_t
                        >             indexed_tokenised_sequence_t;

      indexed_tokenised_sequence_t 
ir(tokenised_sequence_t(tokeniser_t(sv.begin(), sv.end(), delimiter)));

      cout << "Lines:" << endl;
      for(; ir; ++ir)
      {
        cout << ir.index() << ": " << *ir << endl;
      }
    }
  }
</code>


begin 666 integer_to_string.hpp
H(VEN8VQU9&4 /'-T;'-O9G1?:6YT96=E<E]T;U]S=')I;F<N:#X-" ``
`
end

begin 666 string_view_test.zip
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
MR[>M;01N+%QJ+$[?9E ,8SS+P=O/6.3L7IUS68S8G%F.W#"L[!Y,[ F\W5CD
M[)\%"X?#<KQ;C264:'G?FF.5M0V5FVLWUI=5;&[<A&#5^\IJ&ROJ:+!\_JV^
MQJWU#=4Y O40,6E^\G.VS IF.5CTM_*JF6];VZB]N3>JFMO\M<T-/OIFU7C(
M_!\C9'9W[/7EG>60_4ZP/ME-X<G8R&JGM[Y4ZTV/[H3&?H%NAE89Y9_I&_#/
MLY")LQRR%>C#'>SM!EO;V#F]5=84"T>3$274UAGL:*AMF9$=S [70792YL]R
MN):C'[5LSZ_-V/MW36^%L0W?\<.&,[K [(AY9CEBWX35L\RWK6W<Y +;;^UC
M,[+ [%W_OQ"J-P7ZMM[LANOKL/H6\VUK&[L^SJX_8YN^?3MVCD7,/<L1H]\\
MV\%\V]K&S2ZPEH:6MHY[9O0>;("%RS7+X1I%'PK9M;$PXQIYL^'"AM_4NGM&
M-_P3+%S"+(<+QO0S&"9L;6.:X<KXN-",G(R9MQ.9]]5_Z'"]!JM"=AMA:QN?
MR#>$IQ5%NMSI13LSBC%B_<SN\RCLS3 G.# X.# X.# X.# X.# X.&X:_P=0
M2P,$" ``````O&!], ```````````````!$```!S=')I;F=?=FEE=U]T97-T
M+U!+`0(4`!0````(`+Q ?3),P4?G: P``,LR```E``````````$`( "V 0``
M``!S=')I;F=?=FEE=U]T97-T+W-T<FEN9U]V:65W7W1E<W0N8W!P4$L!`A0`
M" ``````V&!], ```````````````!4````````````0`/]!K0P``'-T<FEN
M9U]V:65W7W1E<W0O=F,V+U!+`0(4``H``````*A ?3(````````````````;
M````````````$ #_0> ,``!S=')I;F=?=FEE=U]T97-T+W9C-B]$96)U9R]0
M2P$"% `4````" #88'TRQ8-]==,%```E&P``*0`````````!`" `MH$9#0``
M<W1R:6YG7W9I97=?=&5S="]V8S8O<W1R:6YG7W9I97=?=&5S="YD<W!02P$"
M% `4````" !"6'TR;<,DA=H````K` ``*0`````````!`" `MH$S$P``<W1R
M:6YG7W9I97=?=&5S="]V8S8O<W1R:6YG7W9I97=?=&5S="YD<W=02P$"% `4
M````" #88'TRR:#HH$X0````S ``*0```````````" `MH%4% ``<W1R:6YG
M7W9I97=?=&5S="]V8S8O<W1R:6YG7W9I97=?=&5S="YO<'102P$"% `*````
M``"\8'TR````````````````$0```````````! `_T'I) ``<W1R:6YG7W9I
97=?=&5S="]02P4&``````<`!P`C` ``&"4`````
` end
Mar 28 2005