NCBI C++ ToolKit
bsdiff.cpp
Go to the documentation of this file.

Go to the SVN repository for this file.

1 /* $Id: bsdiff.cpp 92177 2020-12-22 17:57:58Z grichenk $
2  * ===========================================================================
3  *
4  * PUBLIC DOMAIN NOTICE
5  * National Center for Biotechnology Information
6  *
7  * This software/database is a "United States Government Work" under the
8  * terms of the United States Copyright Act. It was written as part of
9  * the author's official duties as a United States Government employee and
10  * thus cannot be copyrighted. This software/database is freely available
11  * to the public for use. The National Library of Medicine and the U.S.
12  * Government have not placed any restriction on its use or reproduction.
13  *
14  * Although all reasonable efforts have been taken to ensure the accuracy
15  * and reliability of the software and data, the NLM and the U.S.
16  * Government do not and cannot warrant the performance or results that
17  * may be obtained by using this software or data. The NLM and the U.S.
18  * Government disclaim all warranties, express or implied, including
19  * warranties of performance, merchantability or fitness for any particular
20  * purpose.
21  *
22  * Please cite the author in any work or product based on this material.
23  *
24  * ===========================================================================
25  *
26  * Author: Colleen Bollin
27  *
28  * File Description:
29  * check biosource and structured comment descriptors against biosample database
30  *
31  */
32 
33 #include <ncbi_pch.hpp>
34 #include <corelib/ncbistd.hpp>
35 #include <corelib/ncbistre.hpp>
36 #include <corelib/ncbiapp.hpp>
37 #include <corelib/ncbienv.hpp>
38 #include <corelib/ncbiargs.hpp>
39 #include <corelib/ncbiutil.hpp>
40 
41 #include <serial/serial.hpp>
42 #include <serial/objistr.hpp>
43 #include <serial/objectio.hpp>
44 
46 #include <connect/ncbi_util.h>
48 
49 // Objects includes
51 #include <objects/seq/Bioseq.hpp>
55 #include <objects/seq/Seq_inst.hpp>
67 #include <objects/seq/Pubdesc.hpp>
68 #include <objects/pub/Pub.hpp>
74 #include <objects/biblio/Affil.hpp>
84 #include <util/line_reader.hpp>
86 #include <util/format_guess.hpp>
87 
89 
90 // Object Manager includes
92 #include <objmgr/scope.hpp>
93 #include <objmgr/seq_descr_ci.hpp>
94 #include <objmgr/bioseq_handle.hpp>
95 #include <objmgr/bioseq_ci.hpp>
96 #include <objmgr/seqdesc_ci.hpp>
97 
99 #ifdef HAVE_NCBI_VDB
101 #endif
104 
105 
108 
109 #include <common/test_assert.h> /* This header must go last */
110 
111 
112 using namespace ncbi;
113 using namespace objects;
114 using namespace xml;
115 using namespace biosample_util;
116 
117 const char * BSDIFF_APP_VER = "1.0";
118 
119 // ----------------------------------------------------------------------------
120 void
122  const string& source,
123  const TBiosampleFieldDiffList& diffList,
124  CNcbiOstream& ostr)
125 // ----------------------------------------------------------------------------
126 {
127  PrettyPrint(diffList, ostr, 20, 40);
128 }
129 
130 // ----------------------------------------------------------------------------
133  const string& bioSampleAcc)
134 // ----------------------------------------------------------------------------
135 {
137  bioSampleAcc, false, nullptr);
138  return pSeqDescrs;
139 }
140 
141 
142 // ----------------------------------------------------------------------------
143 void
145  const CSeq_descr& bioSample,
146  const CSeq_descr& pDescriptorSet,
148 // ----------------------------------------------------------------------------
149 {
150  diffs.clear();
151  for (auto pSourceDesc: pDescriptorSet.Get()) {
152  const CSeqdesc& sourceDesc = *pSourceDesc;
153  if (!sourceDesc.IsSource()) {
154  continue;
155  }
157  bioSample, sourceDesc.GetSource(), diffs);
158  }
159 }
160 
161 
162 // ----------------------------------------------------------------------------
165  const string& fileName)
166 // ----------------------------------------------------------------------------
167 {
168  unique_ptr<CNcbiIfstream> pInStr(new CNcbiIfstream(fileName.c_str(), ios::binary));
170  eSerial_AsnText, *pInStr, eTakeOwnership);
171  CRef<CSeq_descr> pDescrs(new CSeq_descr);
172  try {
173  pI->Read(ObjectInfo(*pDescrs));
174  }
175  catch (CException&) {
176  return pDescrs;
177  }
178  return pDescrs;
179 }
180 
181 
182 // ----------------------------------------------------------------------------
184  const string& bioSampleAcc,
185  CRef<CSeq_descr> pDescriptorSet)
186 // ----------------------------------------------------------------------------
187 {
188  CRef<CSeq_descr> pBioSample = LoadBioSampleFromAcc(bioSampleAcc);
189  if (!pBioSample) {
190  cerr << "Differ: Unable to load biosample with given accession." << "\n";
191  return 1;
192  }
194  GenerateDiffListFromDescriptors(*pBioSample, *pDescriptorSet, diffs);
195  PrintDiffList(bioSampleAcc, diffs, cout);
196  return 0;
197 }
198 
199 // ----------------------------------------------------------------------------
201  const string& bioSampleAcc,
202  const CBioSource& bioSource)
203 // ----------------------------------------------------------------------------
204 {
205  //CRef<CSeq_descr> pBioSample = LoadBioSampleFromAcc(bioSampleAcc);
207  CBioSource sampleSource;
208 
210  bioSampleAcc, bioSource, sampleSource, diffs)) {
211  PrintDiffList(bioSampleAcc, diffs, cout);
212  }
213  return 0;
214 }
215 
216 
217 // ----------------------------------------------------------------------------
219  const string& bioSampleFile,
220  CRef<CSeq_descr> pDescriptorSet)
221 // ----------------------------------------------------------------------------
222 {
223  CRef<CSeq_descr> pBioSample = LoadBioSampleFromFile(bioSampleFile);
225  GenerateDiffListFromDescriptors(*pBioSample, *pDescriptorSet, diffs);
226  PrintDiffList("Source", diffs, cout);
227  return 0;
228 }
229 
230 
231 // ----------------------------------------------------------------------------
234  const string& inFile)
235 // ----------------------------------------------------------------------------
236 {
237  unique_ptr<CNcbiIfstream> pInStr(new CNcbiIfstream(inFile.c_str(), ios::binary));
239  eSerial_AsnText, *pInStr, eTakeOwnership);
240  CRef<CSeq_descr> pDescrs(new CSeq_descr);
241  try {
242  pI->Read(ObjectInfo(*pDescrs));
243  }
244  catch (CException&) {
245  return pDescrs;
246  }
247  return pDescrs;
248 }
249 
250 
251 // ============================================================================
253 // ============================================================================
254 {
255 public:
256  CBsDiffApp(void);
257 
258  virtual void Init(void);
259  virtual int Run (void);
260 
261 private:
262  int xCompareSeqEntry(
263  const CRef<CSeq_entry>&);
264  int xCompareSeqEntryAccession(
265  const string&);
266  int xCompareSeqEntryAccessionList(
267  const string&);
268  int xCompareSeqEntryFile(
269  const string&);
270 
271  CRef<CSeq_entry> xLoadSeqEntry(
272  const string&);
273 
274  CRef<CBioSource> xGetBioSource(
276  vector<string> xGetBioSampleAccs(
278 
281 };
282 
283 
284 // ----------------------------------------------------------------------------
286 // ----------------------------------------------------------------------------
287 {
288  CONNECT_Init(&GetConfig());
289  mpObjmgr = CObjectManager::GetInstance();
290  if (!mpObjmgr) {
291  NCBI_THROW(CException, eUnknown, "Could not create object manager");
292  }
294  mpScope.Reset(new CScope(*mpObjmgr));
295  mpScope->AddDefaults();
296 }
297 
298 
299 // ----------------------------------------------------------------------------
301 // ----------------------------------------------------------------------------
302 {
303  unique_ptr<CArgDescriptions> arg_desc(new CArgDescriptions);
304 
305  arg_desc->AddDefaultKey(
306  "biosource",
307  "biosource_asn1",
308  "BioSource info to compare",
310  "");
311 
312  arg_desc->AddDefaultKey(
313  "biosample-acc",
314  "biosample_accession",
315  "biosample, retrieve online by accession",
317  "");
318 
319  arg_desc->AddDefaultKey(
320  "biosample-file",
321  "biosample_local_filename",
322  "biosample, retrieve locally from filename",
324  "");
325 
326  arg_desc->AddDefaultKey(
327  "seq-entry-acc",
328  "seq_entry_accession",
329  "seq-entry, to be used for both biosource and biosample",
331  "");
332 
333  arg_desc->AddDefaultKey(
334  "seq-entry-acc-list",
335  "seq_entry_accession_list",
336  "accession_list, containing multiple seq entry accessions",
338  "");
339 
340  arg_desc->AddDefaultKey(
341  "seq-entry-file",
342  "seq_entry_file",
343  "file, containing seq entry in ASN.1 format",
345  "");
346 
347  string prog_description = "BioSample Checker\n";
348  arg_desc->SetUsageContext(GetArguments().GetProgramBasename(),
349  prog_description, false);
350 
351  // Pass argument descriptions to the application
352  SetupArgDescriptions(arg_desc.release());
353 
354 }
355 
356 
357 // ----------------------------------------------------------------------------
359 // ----------------------------------------------------------------------------
360 {
361  const CArgs& args = GetArgs();
362 
363  string bioSampleAcc = args["biosample-acc"].AsString();
364  string bioSampleFile = args["biosample-file"].AsString();
365  string bioSourceFile = args["biosource"].AsString();
366  string seqEntryAcc = args["seq-entry-acc"].AsString();
367  string seqEntryAccList = args["seq-entry-acc-list"].AsString();
368  string seqEntryFile = args["seq-entry-file"].AsString();
369 
370  if (seqEntryAcc.empty() && seqEntryAccList.empty() && seqEntryFile.empty()) {
371  if (bioSampleAcc.empty() && bioSampleFile.empty()) {
372  cerr << "Bad arguments: Need to uniquely specify biosample." << endl;
373  return 1;
374  }
375  if (!bioSampleAcc.empty() && !bioSampleFile.empty()) {
376  cerr << "Bad arguments: Need to uniquely specify biosample." << endl;
377  return 1;
378  }
379  if (bioSourceFile.empty()) {
380  cerr << "Bad arguments: Need to supply biosource." << endl;
381  return 1;
382  }
383  }
384 
385  if (!seqEntryFile.empty() && !seqEntryAcc.empty()) {
386  auto otherStuff = bioSampleAcc + bioSampleFile + bioSourceFile;
387  if (!otherStuff.empty()) {
388  cerr << "Bad arguments: seq-entry-acc or seq-entry-file cannot go with anything else."
389  << endl;
390  return 1;
391  }
392  }
393 
394  if (!seqEntryAcc.empty()) {
395  return xCompareSeqEntryAccession(seqEntryAcc);
396  }
397 
398  if (!seqEntryAccList.empty()) {
399  return xCompareSeqEntryAccessionList(seqEntryAccList);
400  }
401 
402  if (!seqEntryFile.empty()) {
403  return xCompareSeqEntryFile(seqEntryFile);
404  }
405 
406  CRef<CSeq_descr> pBioSource = LoadBioSource(bioSourceFile);
407  if (!bioSampleAcc.empty()) {
408  return CompareBioSampleAccessionToDescriptors(bioSampleAcc, pBioSource);
409  }
410  if (!bioSampleFile.empty()) {
411  return CompareBioSampleFileToDescriptors(bioSampleFile, pBioSource);
412  }
413  cerr << "Internal error: utility completed without doing anything." << endl;
414  return 1;
415 }
416 
417 
418 // ----------------------------------------------------------------------------
421  const string& accession)
422 // ----------------------------------------------------------------------------
423 {
424  try {
425  mpScope->ResetDataAndHistory();
426  CSeq_id_Handle idh = CSeq_id_Handle::GetHandle(accession);
427  CBioseq_Handle bsh = mpScope->GetBioseqHandle(idh);
429 
430  CRef<CSeq_entry> pSeqEntry(new CSeq_entry());
431  pSeqEntry->Assign(*seh.GetCompleteSeq_entry());
432  return pSeqEntry;
433  }
434  catch (CException&) {
435  }
436  return CRef<CSeq_entry>();
437 }
438 
439 
440 // ----------------------------------------------------------------------------
441 int
443  const string& filename)
444 // ----------------------------------------------------------------------------
445 {
446  CNcbiIfstream ifstr(filename.c_str());
447  string accession;
448  int counter = 0;
449  while (!ifstr.eof()) {
450  std::getline(ifstr, accession);
451  if (!accession.empty()) {
452  ++counter;
453  cout << "Differ: Processing accession \"" << accession << "\" ("
454  << counter << ") ---" << endl << endl;
455  if (!xCompareSeqEntryAccession(accession)) {
456  return 1;
457  }
458  }
459  }
460  return 0;
461 }
462 
463 // ----------------------------------------------------------------------------
464 int
466  const string& seqEntryFile)
467 // ----------------------------------------------------------------------------
468 {
470  CNcbiIstream* pInputStream = &NcbiCin;
471 
472  bool bDeleteOnClose = false;
473  pInputStream = new CNcbiIfstream(seqEntryFile.c_str(), ios::binary);
474  bDeleteOnClose = true;
476  serial, *pInputStream, (bDeleteOnClose ? eTakeOwnership : eNoOwnership));
477  if (!pI) {
478  cerr << "Differ: Unable to open input seq-entry file" << "\n";
479  return 1;
480  }
481  unique_ptr<CObjectIStream> pIs(pI);
482  CRef<CSeq_entry> pSeqEntry(new CSeq_entry);
483  try {
484  *pI >> *pSeqEntry;
485  }
486  catch (CException&) {
487  cerr << "Differ: Unable to load input seq-entry from file" << "\n";
488  return 1;
489  }
490  return xCompareSeqEntry(pSeqEntry);
491 }
492 
493 // ----------------------------------------------------------------------------
494 int
496  const string& accession)
497 // ----------------------------------------------------------------------------
498 {
499  CRef<CSeq_entry> pSeqEntry;
500  try {
501  pSeqEntry = xLoadSeqEntry(accession);
502  }
503  catch (CException&) {
504  cerr << "Loader: Unable to retrieve seq_entry \"" << accession
505  << "\"." << endl;
506  return 1;
507  }
508  return xCompareSeqEntry(pSeqEntry);
509 }
510 
511 
512 // ----------------------------------------------------------------------------
513 int
515  const CRef<CSeq_entry>& pSeqEntry)
516 // ----------------------------------------------------------------------------
517 {
518  if (!pSeqEntry) {
519  cerr << "Differ: Unable to load input seq-entry from file." << "\n";
520  return 1;
521  }
522  auto pBioSource = xGetBioSource(pSeqEntry);
523  if (!pBioSource) {
524  cerr << "Differ: Given sequence does not have a biosource." << endl;
525  return 1;
526  }
527  auto bioSampleAccessions = xGetBioSampleAccs(pSeqEntry);
528  if (bioSampleAccessions.empty()) {
529  cerr << "Differ: Given sequence does not contain biosample links."
530  << endl;
531  return 1;
532  }
533  CBioSource fusedSource;
535  for (auto bioSampleAcc: bioSampleAccessions) {
537  bioSampleAcc, *pBioSource, fusedSource, diffs)) {
538  PrintDiffList(bioSampleAcc, diffs, cout);
539  }
540  }
541  return 0;
542 }
543 
544 
545 // ----------------------------------------------------------------------------
548  CRef<CSeq_entry> pSeqEntry)
549 // ----------------------------------------------------------------------------
550 {
551  assert(pSeqEntry);
552  CRef<CBioSource> pBioSource;
553  auto descriptors = pSeqEntry->GetDescr().Get();
554  for (auto descriptor: descriptors) {
555  if (descriptor->IsSource()) {
556  pBioSource.Reset(new CBioSource);
557  pBioSource->Assign(descriptor->GetSource());
558  return pBioSource;
559  }
560  }
561  return pBioSource;
562 }
563 
564 
565 // ----------------------------------------------------------------------------
566 vector<string>
568  CRef<CSeq_entry> pSeqEntry)
569 // ----------------------------------------------------------------------------
570 {
571  assert(pSeqEntry);
572  vector<string> bioSampleAccs;
573  auto descriptors = pSeqEntry->GetDescr().Get();
574  for (auto descriptor: descriptors) {
575  if (!descriptor->IsUser() ||
576  descriptor->GetUser().GetType().GetStr() != "DBLink") {
577  continue;
578  }
579  auto descriptorData = descriptor->GetUser().GetData();
580  for (auto entry: descriptorData) {
581  if (!entry->CanGetLabel() || entry->GetLabel().GetStr() != "BioSample") {
582  continue;
583  }
584  if (!entry->CanGetData()) {
585  continue;
586  }
587  auto& data = entry->GetData();
588  if (data.IsStr()) {
589  bioSampleAccs.push_back(data.GetStr());
590  break;
591  }
592  if (data.IsStrs()) {
593  bioSampleAccs.insert(
594  bioSampleAccs.end(), data.GetStrs().begin(), data.GetStrs().end());
595  break;
596  }
597  }
598  }
599  return bioSampleAccs;
600 }
601 
602 
603 // ============================================================================
604 int main(int argc, const char* argv[])
605 // ============================================================================
606 {
607  return CBsDiffApp().AppMain(argc, argv, 0, eDS_Default, 0);
608 }
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
User-defined methods of the data storage class.
vector< CRef< CBiosampleFieldDiff > > TBiosampleFieldDiffList
CRef< CSeq_descr > GetBiosampleData(const string &accession, bool use_dev_server=false, TBioSamples *cache=NULL)
void GenerateDiffListFromBioSource(const CSeq_descr &bioSample, const CBioSource &bioSource, TBiosampleFieldDiffList &diffs)
void PrettyPrint(const TBiosampleFieldDiffList &diffList, CNcbiOstream &ostr, size_t keyWidth=20, size_t valueWidth=40)
void PrintDiffList(const string &source, const TBiosampleFieldDiffList &diffList, CNcbiOstream &ostr)
Definition: bsdiff.cpp:121
CRef< CSeq_descr > LoadBioSampleFromAcc(const string &bioSampleAcc)
Definition: bsdiff.cpp:132
const char * BSDIFF_APP_VER
Definition: bsdiff.cpp:117
CRef< CSeq_descr > LoadBioSampleFromFile(const string &fileName)
Definition: bsdiff.cpp:164
void GenerateDiffListFromDescriptors(const CSeq_descr &bioSample, const CSeq_descr &pDescriptorSet, TBiosampleFieldDiffList &diffs)
Definition: bsdiff.cpp:144
CRef< CSeq_descr > LoadBioSource(const string &inFile)
Definition: bsdiff.cpp:233
int CompareBioSampleAccessionToDescriptors(const string &bioSampleAcc, CRef< CSeq_descr > pDescriptorSet)
Definition: bsdiff.cpp:183
int main(int argc, const char *argv[])
Definition: bsdiff.cpp:604
int CompareBioSampleAccessionToBioSource(const string &bioSampleAcc, const CBioSource &bioSource)
Definition: bsdiff.cpp:200
int CompareBioSampleFileToDescriptors(const string &bioSampleFile, CRef< CSeq_descr > pDescriptorSet)
Definition: bsdiff.cpp:218
CArgDescriptions –.
Definition: ncbiargs.hpp:541
CArgs –.
Definition: ncbiargs.hpp:379
CBioseq_Handle –.
CRef< CSeq_entry > xLoadSeqEntry(const string &)
Definition: bsdiff.cpp:420
virtual int Run(void)
Run the application.
Definition: bsdiff.cpp:358
int xCompareSeqEntryFile(const string &)
Definition: bsdiff.cpp:465
int xCompareSeqEntry(const CRef< CSeq_entry > &)
Definition: bsdiff.cpp:514
CRef< CObjectManager > mpObjmgr
Definition: bsdiff.cpp:279
int xCompareSeqEntryAccessionList(const string &)
Definition: bsdiff.cpp:442
CRef< CBioSource > xGetBioSource(CRef< CSeq_entry >)
Definition: bsdiff.cpp:547
int xCompareSeqEntryAccession(const string &)
Definition: bsdiff.cpp:495
vector< string > xGetBioSampleAccs(CRef< CSeq_entry >)
Definition: bsdiff.cpp:567
CRef< CScope > mpScope
Definition: bsdiff.cpp:280
virtual void Init(void)
Initialize the application.
Definition: bsdiff.cpp:300
CBsDiffApp(void)
Definition: bsdiff.cpp:285
static TRegisterLoaderInfo RegisterInObjectManager(CObjectManager &om, CReader *reader=0, CObjectManager::EIsDefault is_default=CObjectManager::eDefault, CObjectManager::TPriority priority=CObjectManager::kPriority_NotSet)
Definition: gbloader.cpp:366
CObjectIStream –.
Definition: objistr.hpp:93
CScope –.
Definition: scope.hpp:92
@Seq_descr.hpp User-defined methods of the data storage class.
Definition: Seq_descr.hpp:55
CSeq_entry_Handle –.
Definition: Seq_entry.hpp:56
const CSeq_descr & GetDescr(void) const
Definition: Seq_entry.cpp:120
Include a standard set of the NCBI C++ Toolkit most basic headers.
static void Init(void)
Definition: cursor6.c:76
char data[12]
Definition: iconv.c:80
int AppMain(int argc, const char *const *argv, const char *const *envp=0, EAppDiagStream diag=eDS_Default, const char *conf=NcbiEmptyCStr, const string &name=NcbiEmptyString)
Main function (entry point) for the NCBI application.
Definition: ncbiapp.cpp:819
@ eTakeOwnership
An object can take ownership of another.
Definition: ncbi_types.h:136
@ eNoOwnership
No ownership is assumed.
Definition: ncbi_types.h:135
@ eString
An arbitrary string.
Definition: ncbiargs.hpp:589
@ eDS_Default
Try standard log file (app.name + ".log") in /log/, use stderr on failure.
Definition: ncbidiag.hpp:1790
#define NCBI_THROW(exception_class, err_code, message)
Generic macro to throw an exception, given the exception class, error code and message string.
Definition: ncbiexpt.hpp:704
@ eUnknown
Definition: app_popup.hpp:72
virtual void Assign(const CSerialObject &source, ESerialRecursionMode how=eRecursive)
Set object to copy of another one.
ESerialDataFormat
Data file format.
Definition: serialdef.hpp:71
@ eSerial_AsnText
ASN.1 text.
Definition: serialdef.hpp:73
static CSeq_id_Handle GetHandle(const CSeq_id &id)
Normal way of getting a handle, works for any seq-id.
void Read(const CObjectInfo &object)
Read object of know type.
Definition: objistr.cpp:952
pair< TObjectPtr, TTypeInfo > ObjectInfo(C &obj)
Definition: objectinfo.hpp:762
static CObjectIStream * Open(ESerialDataFormat format, CNcbiIstream &inStream, bool deleteInStream)
Create serial object reader and attach it to an input stream.
Definition: objistr.cpp:195
static CRef< CObjectManager > GetInstance(void)
Return the existing object manager or create one.
CConstRef< CSeq_entry > GetCompleteSeq_entry(void) const
Complete and get const reference to the seq-entry.
CSeq_entry_Handle GetTopLevelEntry(void) const
Get top level Seq-entry handle.
void Reset(void)
Reset reference object.
Definition: ncbiobj.hpp:773
IO_PREFIX::ostream CNcbiOstream
Portable alias for ostream.
Definition: ncbistre.hpp:149
#define NcbiCin
Definition: ncbistre.hpp:542
IO_PREFIX::istream CNcbiIstream
Portable alias for istream.
Definition: ncbistre.hpp:146
IO_PREFIX::ifstream CNcbiIfstream
Portable alias for ifstream.
Definition: ncbistre.hpp:439
void Run(void)
Enter the main loop.
void CONNECT_Init(const IRWRegistry *reg=0, CRWLock *lock=0, TConnectInitFlags flag=eConnectInit_OwnNothing, FSSLSetup ssl=0)
Init [X]CONNECT library with the specified "reg" and "lock" (ownership for either or both can be deta...
const TSource & GetSource(void) const
Get the variant data.
Definition: Seqdesc_.cpp:566
bool IsSource(void) const
Check if variant Source is selected.
Definition: Seqdesc_.hpp:1190
const Tdata & Get(void) const
Get the member data.
Definition: Seq_descr_.hpp:166
Lightweight interface for getting lines of data with minimal memory copying.
Magic spell ;-) needed for some weird compilers... very empiric.
const CharType(& source)[N]
Definition: pointer.h:1149
XML library namespace.
Definition: attributes.hpp:57
Defines the CNcbiApplication and CAppException classes for creating NCBI applications.
#define GetArgs
Avoid preprocessor name clash with the NCBI C Toolkit.
Definition: ncbiapp_api.hpp:54
Defines command line argument related classes.
Defines unified interface to application:
NCBI C++ stream class wrappers for triggering between "new" and "old" C++ stream libraries.
Useful/utility classes and methods.
The Object manager core.
#define assert(x)
Definition: srv_diag.hpp:58
C++ I/O stream wrappers to compress/decompress data on-the-fly.
Modified on Wed Apr 17 13:08:16 2024 by modify_doxy.py rev. 669887