Commit 6989f151 authored by Robert Maynard's avatar Robert Maynard Committed by Kitware Robot
Browse files

Merge topic 'demo_example'

d8175015 Fixed issues with NVCC and anonymous namespace compilation issues.
12ffd536 Suppress false positive warnings from nvcc about host/device.
1edc4650 Add a demo for GTC2016 that covers io/filters/rendering.
7543bfe1 Fixed warning about unused variables in RenderSurface.
e0f496ce Fix warnings about unreachable break statement in ParametricCoordinates.
0c36aef5 Fix warnings about unreachable break statement in CellInterpolate.
ec1e1a3a Fix warnings about unreachable break statement in CellDerivative.
265b778a

 Fix unused warning in VTKDataSetReaderBase.
...
Acked-by: Kitware Robot's avatarKitware Robot <kwrobot@kitware.com>
Merge-request: !386
parents 43bb6acd d8175015
......@@ -21,6 +21,7 @@
##=============================================================================
add_subdirectory(clipping)
add_subdirectory(demo)
add_subdirectory(hello_world)
add_subdirectory(isosurface)
add_subdirectory(multi_backend)
......
##=============================================================================
##
## Copyright (c) Kitware, Inc.
## All rights reserved.
## See LICENSE.txt for details.
##
## This software is distributed WITHOUT ANY WARRANTY; without even
## the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
## PURPOSE. See the above copyright notice for more information.
##
## Copyright 2015 Sandia Corporation.
## Copyright 2015 UT-Battelle, LLC.
## Copyright 2015 Los Alamos National Security.
##
## Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
## the U.S. Government retains certain rights in this software.
## Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
## Laboratory (LANL), the U.S. Government retains certain rights in
## this software.
##
##=============================================================================
find_package(MESA REQUIRED)
if(VTKm_CUDA_FOUND)
cuda_add_executable(Demo Demo.cu)
else()
add_executable(Demo Demo.cxx)
endif()
target_include_directories(Demo PRIVATE ${OSMESA_INCLUDE_DIR})
target_link_libraries(Demo ${OSMESA_LIBRARY} ${VTKm_LIBRARIES})
target_compile_options(Demo PRIVATE ${VTKm_COMPILE_OPTIONS})
//============================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt for details.
// This software is distributed WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information.
//
// Copyright 2014 Sandia Corporation.
// Copyright 2014 UT-Battelle, LLC.
// Copyright 2014 Los Alamos National Security.
//
// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
// the U.S. Government retains certain rights in this software.
//
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
// Laboratory (LANL), the U.S. Government retains certain rights in
// this software.
//============================================================================
#define BOOST_SP_DISABLE_THREADS
#include "Demo.cxx"
\ No newline at end of file
//============================================================================
// Copyright (c) Kitware, Inc.
// All rights reserved.
// See LICENSE.txt for details.
// This software is distributed WITHOUT ANY WARRANTY; without even
// the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
// PURPOSE. See the above copyright notice for more information.
//
// Copyright 2014 Sandia Corporation.
// Copyright 2014 UT-Battelle, LLC.
// Copyright 2014 Los Alamos National Security.
//
// Under the terms of Contract DE-AC04-94AL85000 with Sandia Corporation,
// the U.S. Government retains certain rights in this software.
//
// Under the terms of Contract DE-AC52-06NA25396 with Los Alamos National
// Laboratory (LANL), the U.S. Government retains certain rights in
// this software.
//============================================================================
#include <vtkm/cont/testing/MakeTestDataSet.h>
#include <vtkm/rendering/Window.h>
#include <vtkm/rendering/RenderSurface.h>
#include <vtkm/rendering/Scene.h>
#include <vtkm/rendering/Plot.h>
#include <vtkm/rendering/SceneRendererOSMesa.h>
#include <vtkm/cont/DeviceAdapter.h>
#include <vtkm/cont/testing/Testing.h>
#include <vtkm/io/reader/VTKDataSetReader.h>
#include <vtkm/filter/MarchingCubes.h>
#include <vtkm/cont/DataSetFieldAdd.h>
#include <iostream>
// This example reads an input vtk file specified on the command-line (or generates a default
// input data set if none is provided), uses VTK-m's rendering engine to render it to an
// output file using OS Mesa, instantiates an isosurface filter using VTK-m's filter
// mechanism, computes an isosurface on the input data set, packages the output of the filter
// in a new data set, and renders this output data set in a separate iamge file, again
// using VTK-m's rendering engine with OS Mesa.
int main(int argc, char* argv[])
{
// Input variable declarations
vtkm::cont::DataSet inputData;
vtkm::Float32 isovalue;
std::string fieldName;
// Get input data from specified file, or generate test data set
if (argc < 3)
{
vtkm::cont::testing::MakeTestDataSet maker;
inputData = maker.Make3DUniformDataSet0();
isovalue = 100.0f;
fieldName = "pointvar";
}
else
{
std::cout << "using: " << argv[1] << " as MarchingCubes input file" << std::endl;
vtkm::io::reader::VTKDataSetReader reader(argv[1]);
inputData = reader.ReadDataSet();
isovalue = atof(argv[2]);
fieldName = "SCALARS:pointvar";
}
typedef vtkm::rendering::SceneRendererOSMesa< > SceneRenderer;
typedef vtkm::rendering::RenderSurfaceOSMesa RenderSurface;
// Set up a view for rendering the input data
const vtkm::cont::CoordinateSystem coords = inputData.GetCoordinateSystem();
SceneRenderer sceneRenderer;
vtkm::rendering::View3D &view = sceneRenderer.GetView();
vtkm::Float64 coordsBounds[6];
coords.GetBounds(coordsBounds,VTKM_DEFAULT_DEVICE_ADAPTER_TAG());
vtkm::Vec<vtkm::Float32,3> totalExtent;
totalExtent[0] = vtkm::Float32(coordsBounds[1] - coordsBounds[0]);
totalExtent[1] = vtkm::Float32(coordsBounds[3] - coordsBounds[2]);
totalExtent[2] = vtkm::Float32(coordsBounds[5] - coordsBounds[4]);
vtkm::Float32 mag = vtkm::Magnitude(totalExtent);
vtkm::Normalize(totalExtent);
view.LookAt = totalExtent * (mag * .5f);
view.Up = vtkm::make_Vec(0.f, 1.f, 0.f);
view.NearPlane = 1.f;
view.FarPlane = 100.f;
view.FieldOfView = 60.f;
view.Height = 512;
view.Width = 512;
view.Position = totalExtent * (mag * 2.f);
vtkm::rendering::ColorTable colorTable("thermal");
sceneRenderer.SetActiveColorTable(colorTable);
sceneRenderer.SetView(view);
// Create a scene for rendering the input data
vtkm::rendering::Scene3D scene;
vtkm::rendering::Color bg(0.2f, 0.2f, 0.2f, 1.0f);
vtkm::rendering::RenderSurfaceOSMesa surface(512,512,bg);
scene.plots.push_back(vtkm::rendering::Plot(inputData.GetCellSet(),
inputData.GetCoordinateSystem(),
inputData.GetField(fieldName),
colorTable));
// Create a window and use it to render the input data using OS Mesa
vtkm::rendering::Window3D<SceneRenderer, RenderSurface> w1(scene,
sceneRenderer,
surface,
bg);
w1.Initialize();
w1.Paint();
w1.SaveAs("demo_input.pnm");
// Create an isosurface filter
vtkm::filter::MarchingCubes filter;
filter.SetGenerateNormals(false);
filter.SetMergeDuplicatePoints(false);
filter.SetIsoValue(isovalue);
vtkm::filter::DataSetResult result = filter.Execute( inputData,
inputData.GetField(fieldName) );
filter.MapFieldOntoOutput(result, inputData.GetField(fieldName));
vtkm::cont::DataSet& outputData = result.GetDataSet();
// Render a separate image with the output isosurface
std::cout << "about to plot the results of the MarchingCubes filter" << std::endl;
scene.plots.clear();
scene.plots.push_back(vtkm::rendering::Plot(outputData.GetCellSet(),
outputData.GetCoordinateSystem(),
outputData.GetField(fieldName),
colorTable));
vtkm::rendering::Window3D< SceneRenderer, RenderSurface> w2(scene,
sceneRenderer,
surface,
bg);
w2.Initialize();
w2.Paint();
w2.SaveAs("demo_output.pnm");
return 0;
}
# vtk DataFile Version 1.0
Grid example
ASCII
DATASET STRUCTURED_POINTS
DIMENSIONS 3 2 3
SPACING 1 1 1
ORIGIN 0 0 0
POINT_DATA 18
SCALARS pointvar float 1
LOOKUP_TABLE default
10.1
20.1
30.1
40.1
50.2
60.2
70.2
80.2
90.3
100.3
110.3
120.3
130.4
140.4
150.4
160.4
170.5
180.5
\ No newline at end of file
......@@ -44,6 +44,7 @@ public:
typedef PortalTypeSecond_ PortalTypeSecond;
typedef PortalTypeThird_ PortalTypeThird;
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
ArrayPortalExecCartesianProduct()
: PortalFirst(), PortalSecond(), PortalThird()
......
......@@ -184,9 +184,11 @@ public:
VTKM_STATIC_ASSERT(NUM_COMPONENTS == PortalTypes::ARITY);
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
ArrayPortalCompositeVector() { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_CONT_EXPORT
ArrayPortalCompositeVector(
const PortalTypes portals,
......
......@@ -40,6 +40,7 @@ public:
typedef PortalTypeFirst_ PortalTypeFirst;
typedef PortalTypeSecond_ PortalTypeSecond;
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
ArrayPortalExecZip()
: PortalFirst(), PortalSecond()
......
......@@ -46,7 +46,8 @@ public:
/// \c ArrayPortaltoIterators should be constructed with an instance of
/// the array portal.
///
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
ArrayPortalToIterators(const PortalType &portal) : Portal(portal) { }
/// The type of the iterator.
......@@ -56,14 +57,16 @@ public:
/// Returns an iterator pointing to the beginning of the ArrayPortal.
///
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
IteratorType GetBegin() const {
return vtkm::cont::internal::make_IteratorBegin(this->Portal);
}
/// Returns an iterator pointing to one past the end of the ArrayPortal.
///
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
IteratorType GetEnd() const {
return vtkm::cont::internal::make_IteratorEnd(this->Portal);
}
......@@ -75,7 +78,8 @@ private:
/// Convienience function for converting an ArrayPortal to a begin iterator.
///
template<typename PortalType>
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
typename vtkm::cont::ArrayPortalToIterators<PortalType>::IteratorType
ArrayPortalToIteratorBegin(const PortalType &portal)
{
......@@ -86,7 +90,8 @@ ArrayPortalToIteratorBegin(const PortalType &portal)
/// Convienience function for converting an ArrayPortal to an end iterator.
///
template<typename PortalType>
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
typename vtkm::cont::ArrayPortalToIterators<PortalType>::IteratorType
ArrayPortalToIteratorEnd(const PortalType &portal)
{
......
......@@ -43,8 +43,11 @@ public:
typedef typename std::iterator_traits<IteratorT>::value_type ValueType;
typedef IteratorT IteratorType;
VTKM_CONT_EXPORT ArrayPortalFromIterators() { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_CONT_EXPORT
ArrayPortalFromIterators() { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_CONT_EXPORT
ArrayPortalFromIterators(IteratorT begin, IteratorT end)
: BeginIterator(begin)
......@@ -73,25 +76,29 @@ public:
: BeginIterator(src.GetIteratorBegin()), NumberOfValues(src.GetNumberOfValues())
{ }
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
vtkm::Id GetNumberOfValues() const
{
return this->NumberOfValues;
}
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
ValueType Get(vtkm::Id index) const
{
return *this->IteratorAt(index);
}
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
void Set(vtkm::Id index, const ValueType& value) const
{
*this->IteratorAt(index) = value;
}
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
IteratorT GetIteratorBegin() const {
return this->BeginIterator;
}
......@@ -100,7 +107,8 @@ private:
IteratorT BeginIterator;
vtkm::Id NumberOfValues;
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
IteratorT IteratorAt(vtkm::Id index) const
{
VTKM_ASSERT_CONT(index >= 0);
......@@ -131,7 +139,8 @@ public:
#ifndef VTKM_MSVC
typedef _IteratorType IteratorType;
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
ArrayPortalToIterators(const PortalType &portal)
: Iterator(portal.GetIteratorBegin()),
NumberOfValues(portal.GetNumberOfValues())
......@@ -143,7 +152,8 @@ public:
// wrap the iterator in a check.
typedef stdext::checked_array_iterator<_IteratorType> IteratorType;
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
ArrayPortalToIterators(const PortalType &portal)
: Iterator(portal.GetIteratorBegin(),
static_cast<size_t>(portal.GetNumberOfValues())),
......@@ -152,10 +162,12 @@ public:
#endif // VTKM_MSVC
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
IteratorType GetBegin() const { return this->Iterator; }
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
IteratorType GetEnd() const {
IteratorType iterator = this->Iterator;
typedef typename std::iterator_traits<IteratorType>::difference_type
......
......@@ -124,7 +124,8 @@ class ArrayPortalToIterators<
DelegateArrayPortalToIterators;
public:
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
ArrayPortalToIterators(const PortalType &portal)
: DelegateIterators(portal.GetDelegatePortal()),
NumberOfValues(portal.GetNumberOfValues())
......@@ -132,12 +133,14 @@ public:
typedef typename DelegateArrayPortalToIterators::IteratorType IteratorType;
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
IteratorType GetBegin() const {
return this->DelegateIterators.GetBegin();
}
VTKM_CONT_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
IteratorType GetEnd() const {
IteratorType iterator = this->GetBegin();
std::advance(iterator, this->NumberOfValues);
......
......@@ -106,6 +106,7 @@ struct KeyCompare
KeyCompare(): CompareFunctor() {}
explicit KeyCompare(BinaryCompare c): CompareFunctor(c) {}
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
bool operator()(const vtkm::Pair<T,U>& a, const vtkm::Pair<T,U>& b) const
{
......@@ -139,6 +140,7 @@ struct ReduceKernel : vtkm::exec::FunctorBase
PortalLength( portal.GetNumberOfValues() )
{ }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
T operator()(vtkm::Id index) const
{
......@@ -194,6 +196,7 @@ struct ReduceStencilGeneration : vtkm::exec::FunctorBase
KeyState(kstate)
{ }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id centerIndex) const
{
......@@ -303,7 +306,8 @@ struct CopyKernel
OutputOffset(outputOffset)
{ }
VTKM_EXEC_EXPORT
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
void operator()(vtkm::Id index) const
{
typedef typename OutputPortalType::ValueType ValueType;
......@@ -333,6 +337,7 @@ struct LowerBoundsKernel
ValuesPortal(valuesPortal),
OutputPortal(outputPortal) { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id index) const
{
......@@ -381,6 +386,7 @@ struct LowerBoundsComparisonKernel
OutputPortal(outputPortal),
CompareFunctor(binary_compare) { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id index) const
{
......@@ -423,6 +429,7 @@ struct SetConstantKernel
SetConstantKernel(const PortalType &portal, ValueType value)
: Portal(portal), Value(value) { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id index) const
{
......@@ -447,6 +454,7 @@ struct BitonicSortMergeKernel : vtkm::exec::FunctorBase
vtkm::Id groupSize)
: Portal(portal), Compare(compare), GroupSize(groupSize) { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id index) const
{
......@@ -485,6 +493,7 @@ struct BitonicSortCrossoverKernel : vtkm::exec::FunctorBase
vtkm::Id groupSize)
: Portal(portal), Compare(compare), GroupSize(groupSize) { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id index) const
{
......@@ -528,6 +537,7 @@ struct StencilToIndexFlagKernel
OutputPortal(outputPortal),
Predicate(unary_predicate) { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id index) const
{
......@@ -565,6 +575,7 @@ struct CopyIfKernel
OutputPortal(outputPortal),
Predicate(unary_predicate) { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id index) const
{
......@@ -597,6 +608,7 @@ struct ClassifyUniqueKernel
StencilPortalType stencilPortal)
: InputPortal(inputPortal), StencilPortal(stencilPortal) { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id index) const
{
......@@ -634,6 +646,7 @@ struct ClassifyUniqueComparisonKernel
StencilPortal(stencilPortal),
CompareFunctor(binary_compare) { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id index) const
{
......@@ -673,6 +686,7 @@ struct UpperBoundsKernel
ValuesPortal(valuesPortal),
OutputPortal(outputPortal) { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id index) const
{
......@@ -721,6 +735,7 @@ struct UpperBoundsKernelComparisonKernel
OutputPortal(outputPortal),
CompareFunctor(binary_compare) { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id index) const
{
......@@ -772,6 +787,7 @@ struct InclusiveToExclusiveKernel : vtkm::exec::FunctorBase
InitialValue(initialValue)
{ }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id index) const
{
......@@ -800,6 +816,7 @@ struct ScanKernel : vtkm::exec::FunctorBase
Distance(stride/2)
{ }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(vtkm::Id index) const
{
......
......@@ -103,6 +103,7 @@ struct ScanInclusiveBody
OutputPortal(body.OutputPortal),
BinaryOperation(body.BinaryOperation) { }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(const ::tbb::blocked_range<vtkm::Id> &range, ::tbb::pre_scan_tag)
{
......@@ -124,6 +125,7 @@ struct ScanInclusiveBody
this->Sum = temp;
}
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(const ::tbb::blocked_range<vtkm::Id> &range, ::tbb::final_scan_tag)
{
......@@ -152,12 +154,14 @@ struct ScanInclusiveBody
this->Sum = temp;
}
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
void reverse_join(const ScanInclusiveBody &left)
{
this->Sum = this->BinaryOperation(left.Sum, this->Sum);
}
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
void assign(const ScanInclusiveBody &src)
{
......@@ -199,6 +203,7 @@ struct ScanExclusiveBody
BinaryOperation(body.BinaryOperation)
{ }
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(const ::tbb::blocked_range<vtkm::Id> &range, ::tbb::pre_scan_tag)
{
......@@ -217,6 +222,7 @@ struct ScanExclusiveBody
this->Sum = temp;
}
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_EXPORT
void operator()(const ::tbb::blocked_range<vtkm::Id> &range, ::tbb::final_scan_tag)
{
......@@ -246,12 +252,14 @@ struct ScanExclusiveBody
this->Sum = temp;
}
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
void reverse_join(const ScanExclusiveBody &left)
{
this->Sum = this->BinaryOperation(left.Sum, this->Sum);
}
VTKM_SUPPRESS_EXEC_WARNINGS
VTKM_EXEC_CONT_EXPORT
void assign(const ScanExclusiveBody &src)
{
......@@ -261,6 +269,7 @@ struct ScanExclusiveBody