LCOV - code coverage report
Current view: top level - vset/buffer/persistent/filesync - ad_open.hpp (source / functions) Hit Total Coverage
Test: v-set-coverage.info Lines: 32 32 100.0 %
Date: 2019-09-12 Functions: 4 4 100.0 %

          Line data    Source code
       1             : //
       2             : // Author: Vladimir Migashko <migashko@gmail.com>, (C) 2012
       3             : //
       4             : // Copyright: See COPYING file that comes with this distribution
       5             : //
       6             : 
       7             : #ifndef VSET_VSET_BUFFER_PERSISTENT_FILESYNC_AD_OPEN_HPP
       8             : #define VSET_VSET_BUFFER_PERSISTENT_FILESYNC_AD_OPEN_HPP
       9             : 
      10             : #include <fas/system/nullptr.hpp>
      11             : #include <vset/buffer/tags.hpp>
      12             : #include <vset/buffer/persistent/tags.hpp>
      13             : #include <vset/buffer/persistent/filesync/tags.hpp>
      14             : #include <string.h>
      15             : #include <string>
      16             : 
      17             : namespace vset { namespace buffer { namespace persistent{ namespace filesync{
      18             : 
      19           3 : struct ad_open
      20             : {
      21             :   template<typename T>
      22           3 :   void operator()( T& t)
      23             :   {
      24           3 :     std::string file_name = t.get_aspect().template get<_file_name_>();
      25           3 :     this->operator()(t, file_name );
      26           3 :   }
      27             :   
      28             :   template<typename T>
      29          10 :   void operator()( T& t, const std::string& file_name)
      30             :   {
      31          10 :     t.get_aspect().template get<_close_>()(t);
      32          10 :     t.get_aspect().template get<_file_name_>() = file_name;
      33          10 :     t.get_aspect().template get<_open_file_>()(t);
      34          10 :     size_t file_size = t.get_aspect().template get<_file_size_>()(t);
      35             :     typedef typename T::aspect::template advice_cast<_head_type_>::type head_type;
      36          10 :     head_type* head = fas_nullptr;
      37          10 :     if ( file_size < sizeof(head_type) )
      38             :     {
      39           2 :       size_t buffer_size = sizeof(head_type);
      40           2 :       char *data = new char[sizeof(head_type)];
      41           2 :       head = new (data) head_type();
      42           2 :       t.get_aspect().template get<_buffer_size_>() = buffer_size;
      43           2 :       t.get_aspect().template get<_buffer_>() = data;
      44           2 :       head->set_size(0);
      45           2 :       head->set_capacity(0);
      46             :     }
      47             :     else
      48             :     {
      49           8 :       head_type header;
      50           8 :       t.get_aspect().template get<_read_file_>()(t, reinterpret_cast<char*>(&header), sizeof(head_type), 0);
      51           8 :       size_t buffer_size = header.offset() + header.capacity();
      52           8 :       char *data = new char[buffer_size];
      53           8 :       memset(data, 0, buffer_size);
      54           8 :       memcpy(data, &header, sizeof(head_type) );
      55           8 :       t.get_aspect().template get<_buffer_size_>() = buffer_size;
      56           8 :       t.get_aspect().template get<_read_file_>()(t, data + header.offset(), header.size(), header.offset());
      57           8 :       t.get_aspect().template get<_buffer_>() = data;
      58           8 :       head = t.get_aspect().template get<_head_>()(t);
      59             :     }
      60          10 :     t.get_aspect().template get<_size_value_>() = head->size();
      61          10 :     t.get_aspect().template get<_capacity_value_>() = head->capacity();
      62          10 :   }
      63             : };
      64             : 
      65             : }}}}
      66             : 
      67             : #endif

Generated by: LCOV version 1.10